我正在尝试执行以下C代码:
#include <stdio.h>
int a = 5;
int fun1(){
a = 17;
return 3;
}
int main(){
int b;
b = a + fun1();
printf("%d\n", b);
}
当我在我的macbook上运行时,我得到了8的答案,但是当我在Linux中运行时,我得到了20的答案。我有几个朋友运行它,每个人用Mac获得8,而每个人运行Linux得到20.会导致什么?
我对正确答案并不是那么感兴趣,因为我在两个环境背后给出不同答案的原因。 OS X和Linux怎么会导致差异?
答案 0 :(得分:8)
未指定对运算符+
的参数评估顺序。这意味着没有特定的排序,fun1()
可以在表达式a
* 中读取a + fun1()
之前或之后进行评估。您正在看到不同评估顺序对不同平台的影响。
*请注意,函数调用fun1()
引入了一个序列点,因此a + fun1();
的行为定义得很好,即使操作数的评估顺序是未指定< / em>的。没有函数调用就没有序列点(例如a + a++
),这会产生未定义的行为。
答案 1 :(得分:3)
未指定评估操作数的顺序。这意味着在表达式a + fun1()中,编译器可以选择在调用fun1()之前或之后评估它。两个结果都是正确的。你的代码不是。
答案 2 :(得分:1)
没有关于如何评估这些操作数的规范,因此编译器可以选择任一顺序。在这种情况下,您在Mac上使用的编译器对于评估顺序的实现与Linux上的编译器不同,因此显然不一致。编写更干净的代码对于这样的事情非常有帮助。