我有学习函数调用的基本代码。但我对此代码中的内容并不了解。当我与我的答案和预期输出相比时,我感到困惑。 我的代码如下:
#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
你能解释一下原因吗?
答案 0 :(得分:1)
它是C中未定义的行为。它可能因执行或许多其他事情而有所不同。 函数参数的评估顺序未指定。您永远无法解释任何标准规则所看到的行为。当你在另一台机器上的老师面前运行时会产生不同的结果。
最好编写代码,以避免所有这些歧义。
的明确示例在函数调用中
(*pf[f1()]) (f2(), f3() + f4())
可以按任何顺序调用函数
f1
,f2
,f3
和f4
。所有副作用都必须如此 在调用pf [f1()]指向的函数之前完成。
当您传递参数时,它们的评估顺序可能会有所不同。你的printf
示例也是另一个例子。
检查您需要了解的幻灯片 - 必须是幻灯片 未定义的行为
答案 1 :(得分:0)
你能解释一下原因吗?
因为编译器从右到左计算了参数。它允许以任何一种方式执行,并最终生成了代码,就像那样做。你知道,它并不想像Buridan的驴一样死去; - )
你可能会说C编译器没有自由意志。是的,他们不是,但生成的代码依赖于许多不同的东西,例如编译器品牌,版本,命令行选项等。在这种特殊情况下,C标准对C编译器没有任何限制。所以它正式被称为&#34;未定义的行为&#34;。永远不要这样做。