【问题标题】:Compiler differences in g++ 4.7.2 and Intel 13.0.1 vs clang++ 3.2 and g++ 4.8 [duplicate]g ++ 4.7.2和Intel 13.0.1与clang ++ 3.2和g ++ 4.8中的编译器差异[重复]
【发布时间】: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.2Intel C++ 13.0.1,您可以获得:

stdout:
a = 21, b = 20

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

stdout:
a = 21, b = 21

哪一个是正确的?谢谢。

【问题讨论】:

  • 恭喜!你是在 stackoverflow 上问这个问题的第 100 万人 :) !
  • @us2012 +1 让我发笑 :)
  • 所有的编译器都是对的,但是你错了没有用-Wall打开编译器警告,这样可以节省你问这个问题的时间。回到班级后面
  • @us2012 告诉他他赢得了什么,杰瑞! “一辆全新的汽车!”
  • @DavidRodríguez-dribeas Unspecified 并不意味着编译器实现者必须记录它,甚至是一致的;它只是意味着可能发生的事情是有限的。 (未指定评估顺序,但必须有某种顺序。)您所考虑的是实现定义。

标签: c++ compiler-construction g++ clang intel


【解决方案1】:

所有的编译器都是对的。

排队

a = b = a+++a;

您调用Undefined Behaviour,因为a 被修改了两次而没有干预sequence point。 如果你这样做,C++ 标准会授予编译器许可,让他们可以随心所欲。

【讨论】:

  • 好的,我们有什么 b = a+++a;会是同样的情况吗?..
  • @UpGM - 是的。绝对没有理由编写这样的代码。只需使用b = 2 * a; ++a;b = 2 * a + 1; ++a;,无论您想要哪个结果。
  • @BoPersson 我只是想更好地理解这些差异,而不是我会在某处编写这样的代码。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2018-03-10
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多