出乎意料的答案

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();
}

}