【问题标题】:Same code gives different output on Microsoft studio compared to other compilers [duplicate]与其他编译器相比,相同的代码在 Microsoft Studio 上提供不同的输出 [重复]
【发布时间】:2020-05-17 21:34:31
【问题描述】:
int a = 10;

a = a++;

cout << a<<" ";

a++;

cout << a;

在 microsoft Visual 中,它的输出是 11 12

而在其他编译器(如 codechef 和 codeforces)中,它的输出是 10 11

这个问题的输出是在一些 mcq 论文中提出的,正确答案是 10 11 但 any1 也可以解释一下

a = a++;
++a;
cout<<a;

产生 11 的输出 a = a++ 没有做任何事情吗?

【问题讨论】:

  • 如果您使用了正确的警告选项,代码wouldn't even compile
  • @Ayxan 该错误消息是误报警告,被视为错误。由于 C++17(您在链接中使用了 C++2a),该行具有明确定义的行为。 -std=c++2a 选项的警告是错误的。 (另外注意:我不建议默认使用-Ofast。它会破坏标准一致性。)
  • @walnut 和-std=c++17一样gcc.godbolt.org/z/bmsYN4
  • @Ayxan 是的,在这两种情况下都是误报。只有-std=c++14 和更低的行实际上具有未定义的行为。

标签: c++ algorithm


【解决方案1】:

a = a++; 不是正确的语句,因为缺少序列点或未排序(C++11)。

未定义的行为 - 对程序的行为没有限制。未定义行为的示例包括数组边界之外的内存访问、有符号整数溢出、空指针取消引用、在没有任何中间序列点(C++11 之前)的表达式中对同一标量进行多次修改,这些都是未排序的 (从 C++11) 开始,通过不同类型的指针访问对象等。编译器不需要诊断未定义的行为(尽管诊断了许多简单的情况),编译后的程序不需要做任何有意义的事。

https://en.cppreference.com/w/cpp/language/ub

【讨论】:

  • 请注意,从 C++17 开始,它已经定义了行为。自 C++11 以来,sequence points 也不再存在。相反,正确的术语是赋值是unsequenced,具有增量副作用。
  • 嗨@walnut,排序部分包含在引文的突出显示位中,事实上它是在 C++17 之后定义的行为对我来说是新闻,一直在学习。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2017-03-15
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
相关资源
最近更新 更多