#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语言
#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语言
这基本上是按照时间顺序会发生什么:
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'
注意事项:
printf
陈述 - 而这一次以上,它发生每当函数不会在停止子句中结束。您的代码是递归的,但是当调用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
所以如果我做foo(++ a)而不是foo(a + 1),那么它应该改变全局'a'? – user1915016
除非您传递给'foo(..)'''a''的'*(指针),否则'foo()'不能访问外部(全局) – nrathaus
请使用正确的缩进代码中的下一次 – DrummerB
有你试图把一些额外'的printf()'语句来看看发生了什么在执行期间,还是使用运行时调试器(如GDB等)在执行期间监视变量的值? – DevNull
使用调试选项编译(例如'gcc -Wall -g')。使用调试器('gdb')并逐步运行程序'step'。 –