【发布时间】:2013-02-14 13:21:32
【问题描述】:
根据官方 C++ 标准,有人能解释一下为什么下面的简单代码在不同的编译器下运行时会出现不同的输出吗?
换句话说,标准是否对首先发生的事情保持开放态度,a++ 或 b 赋值?
这与函数参数无关,它是同一段在不同编译器上运行的代码。下面是示例代码:
#include <iostream>
using namespace std;
int main() {
int a = 10, b;
a = b = a+++a;
cout << "a = " << a << ", b = " << b;
return 0;
}
代码链接为here。
使用 g++ 4.7.2 和 Intel C++ 13.0.1,您可以获得:
stdout:
a = 21, b = 20
使用 g++ 4.8.0 和 Clang++ 3.2 你会得到:
stdout:
a = 21, b = 21
哪一个是正确的?谢谢。
【问题讨论】:
-
恭喜!你是在 stackoverflow 上问这个问题的第 100 万人 :) !
-
@us2012 +1 让我发笑 :)
-
所有的编译器都是对的,但是你错了没有用
-Wall打开编译器警告,这样可以节省你问这个问题的时间。回到班级后面 -
@us2012 告诉他他赢得了什么,杰瑞! “一辆全新的汽车!”
-
@DavidRodríguez-dribeas Unspecified 并不意味着编译器实现者必须记录它,甚至是一致的;它只是意味着可能发生的事情是有限的。 (未指定评估顺序,但必须有某种顺序。)您所考虑的是实现定义。
标签: c++ compiler-construction g++ clang intel