C代码在OS X与Linux上产生不同的结果

时间:2015-04-08 19:59:33

标签: c linux macos

我正在尝试执行以下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怎么会导致差异?

3 个答案:

答案 0 :(得分:8)

未指定对运算符+的参数评估顺序。这意味着没有特定的排序,fun1()可以在表达式a * 中读取a + fun1()之前或之后进行评估。您正在看到不同评估顺序对不同平台的影响。


*请注意,函数调用fun1()引入了一个序列点,因此a + fun1();的行为定义得很好,即使操作数的评估顺序是未指定< / em>的。没有函数调用就没有序列点(例如a + a++),这会产生未定义的行为

答案 1 :(得分:3)

未指定评估操作数的顺序。这意味着在表达式a + fun1()中,编译器可以选择在调用fun1()之前或之后评估它。两个结果都是正确的。你的代码不是。

答案 2 :(得分:1)

没有关于如何评估这些操作数的规范,因此编译器可以选择任一顺序。在这种情况下,您在Mac上使用的编译器对于评估顺序的实现与Linux上的编译器不同,因此显然不一致。编写更干净的代码对于这样的事情非常有帮助。