g++ 4.7.2 和 Intel 13.0.1 与 clang++ 3.2 和 g++ 4.8 的编译器差异[重复]

问题描述 投票:0回答:1

根据官方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;
}

代码链接是这里

使用 g++ 4.7.2Intel C++ 13.0.1,您将获得:

stdout:
a = 21, b = 20

使用 g++ 4.8.0Clang++ 3.2 你会得到:

stdout:
a = 21, b = 21

哪一个是正确的?谢谢。

c++ g++ clang intel
1个回答
1
投票

所有编译器都是对的。

在排队中

a = b = a+++a;

您调用未定义行为,因为

a
被修改两次而没有中间的序列点。 如果你这样做,C++ 标准就会给予编译器做任何他们喜欢做的事的许可。

© www.soinside.com 2019 - 2024. All rights reserved.