出乎意料的答案
Unexpected answer
我在 Udemy 上了 C 高级课程,那里有一个问题:
以下代码的输出是什么?
#include <stdio.h>
int main(void){
static int i=5;
if(--i){
main();
printf("%d ", i);
}
}
正确答案是 4 3 2 1
,但是当我 运行 在我的 IDE(和在线编译器)中使用这段代码时,它会打印 0 0 0 0
。
在课程中,讲师使用 cygwin 编译器,我有 g++。这可能是不一致的原因吗?
另外我想知道 if(--i)
方法是否比 for
循环的性能概念更快?
谢谢。
发布的代码应打印 0 0 0 0
因为 printf
在递归调用之后,即
main(); // Recursive call
printf("%d ", i); // Print after
如果您改为:
printf("%d ", i); // Print before
main(); // Recursive call
输出将是 4 3 2 1
所以我认为你的讲师使用了最后一种形式而你使用了第一种形式,即不同的代码,不同的结果
原因是 main()
在 printf("%d ", i)
之前被调用。因此,当 if 块被执行时,main()
函数在打印 i
的值之前被调用,并且它会继续这样做直到 if-condition
为假。当 i
等于 0
时,这里 if-condition
变为假。当 if-contidion
为 false 时,函数 return 从调用它的位置返回到之前的状态,然后打印 i
的值,现在是 0
.
要打印 4 3 2 1
,请在调用 main()
函数之前打印值,如下所示
int main(void){
static int i=5;
if(--i){
printf("%d ", i);
main();
}
}
我在 Udemy 上了 C 高级课程,那里有一个问题: 以下代码的输出是什么?
#include <stdio.h>
int main(void){
static int i=5;
if(--i){
main();
printf("%d ", i);
}
}
正确答案是 4 3 2 1
,但是当我 运行 在我的 IDE(和在线编译器)中使用这段代码时,它会打印 0 0 0 0
。
在课程中,讲师使用 cygwin 编译器,我有 g++。这可能是不一致的原因吗?
另外我想知道 if(--i)
方法是否比 for
循环的性能概念更快?
谢谢。
发布的代码应打印 0 0 0 0
因为 printf
在递归调用之后,即
main(); // Recursive call
printf("%d ", i); // Print after
如果您改为:
printf("%d ", i); // Print before
main(); // Recursive call
输出将是 4 3 2 1
所以我认为你的讲师使用了最后一种形式而你使用了第一种形式,即不同的代码,不同的结果
原因是 main()
在 printf("%d ", i)
之前被调用。因此,当 if 块被执行时,main()
函数在打印 i
的值之前被调用,并且它会继续这样做直到 if-condition
为假。当 i
等于 0
时,这里 if-condition
变为假。当 if-contidion
为 false 时,函数 return 从调用它的位置返回到之前的状态,然后打印 i
的值,现在是 0
.
要打印 4 3 2 1
,请在调用 main()
函数之前打印值,如下所示
int main(void){
static int i=5;
if(--i){
printf("%d ", i);
main();
}
}