我有一个基本的代码来学习函数调用。但我不明白这段代码中的某些内容。当我与我的答案和预期输出进行比较时,我感到很困惑。 我的代码如下:
#include <stdio.h>
void f(int a, int b, double c){
printf("%d \n", a);printf("%d \n", b);printf("%f \n", c);
}
int main(void){
int i = 0, x = 7;
float a = 2.25;
f (x=5, x-7, a);
printf("\n\n");
f (x = 6, x-7, a);
printf("\n\n");
printf("%d %d\n",i, i++ );
printf("%d %d\n",i, ++i );
return 0;
}
在最后 2 个 printf 语句中,我的答案是:
0 0
1 1
但输出为:
1 0
2 2
你能解释一下为什么吗?
最佳答案
这是 C 中未定义的行为。它可能会根据执行或许多其他因素而变化。 函数参数的计算顺序未指定。你永远无法用任何标准规则来解释你所看到的行为。当你在老师面前在不同的机器上运行它时,它会给出不同的结果。
最好编写避免所有这些歧义的代码。
standard 6.5.2.2p12 中对此有明确的示例
In the function call
(*pf[f1()]) (f2(), f3() + f4())
the functions
f1
,f2
,f3
, andf4
may be called in any order. All side effects have to be completed before the function pointed to by pf[f1()] is called.
传递参数时的方式相同 - 它们的评估顺序可能会有所不同。您的 printf
示例也是另一个这样的示例。
检查您从中了解这一点的幻灯片 - 必须是一张幻灯片未定义的行为
关于C函数变量改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48241112/