混淆静态int并在printf中调用它们

时间:2016-12-10 15:01:10

标签: c variables static

请测试此代码并给我答案:

#include <stdio.h>

int func() {
static int n = 0;
n++;
return n;
}

int main() {
    /*int first = func();
    int second = func();*/
    printf(" first call : %d \n second call : %d ",func(),func());
    return 0;
}

逻辑上它应该打印1和2,但它打印2和1。 如果取消注释注释并打印变量“first”和“second”,问题就解决了! 发生了什么事?

谢谢你!

3 个答案:

答案 0 :(得分:7)

未指定函数调用参数的计算顺序,即在将返回值传递给func()之前,编译器可以按任意顺序进行两次printf调用。如果您首先将结果分配给变量,显然您可以决定使用它们的顺序。

答案 1 :(得分:0)

传递函数的参数的顺序未在标准中定义,并且由编译器使用的调用约定确定。我认为在你的情况下,使用 cdecl 调用约定(许多C编译器用于x86架构),函数中的参数从右到左进行评估。

答案 2 :(得分:-1)

因为在调用函数时它需要正确的关联.. 即,printf中的最后一个先被调用然后被调用..这就是为什么它打印2然后是1。 尝试使用两个打印语句,如: printf(&#34;第一次调用:%d \ n&#34;,func()); printf(&#34;第二次调用:%d \ n&#34;,func());