2013-12-17 89 views
-7
#include<stdio.h> 

int foo(char a[]) 
{ 
    if(a[1]=='\0') 
    { 
     return 0; 
    } 
    foo(a+1); 
    foo(a+1); 
    printf("%c ",a[1]); 
} 

int main() 
{ 
    foo("123"); 
} 

为什么上面的程序的输出:3 3 2 我想输出是:3 请explain..Thank你。递归C语言

+1

请使用正确的缩进代码中的下一次 – DrummerB

+3

有你试图把一些额外'的printf()'语句来看看发生了什么在执行期间,还是使用运行时调试器(如GDB等)在执行期间监视变量的值? – DevNull

+1

使用调试选项编译(例如'gcc -Wall -g')。使用调试器('gdb')并逐步运行程序'step'。 –

回答

3

这基本上是按照时间顺序会发生什么:

foo(['1','2','3','\0']): 
    a[1] != '\0' 
    foo(['2','3','\0']): 
     a[1] != '\0': 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     print '3' 
    foo(['2','3','\0']): 
     a[1] != '\0': 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     foo('3','\0'): 
      a[1] == '\0' (end) 
     print '3' 
print '2' 

注意事项:

  • 递归首先要“在”,只有当“回来”它打印元素。
  • 一个[1]指的是第二个元素,不是第一次(因为数组索引从0开始)
  • 印刷occures每次递归获取到printf陈述 - 而这一次以上,它发生每当函数不会在停止子句中结束。
2

您的代码是递归的,但是当调用foo(..)时,它会修改本地值a而不是全局值。

因此,当代码从内部foo(..)返回时,会打印一个[1],它是原始字符串中的“2”。

这就是为什么你看到3,3,然后当最后递归的回报,2

关系到我下面的评论:

int foo(char a[]) 

进入

int foo(char *a) 

并且

foo("123"); 

进入

char string[] = "123"; 
foo(&string); 

您还需要更改a[1]a+1

+0

所以如果我做foo(++ a)而不是foo(a + 1),那么它应该改变全局'a'? – user1915016

+0

除非您传递给'foo(..)'''a''的'*(指针),否则'foo()'不能访问外部(全局) – nrathaus