#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'。 –