【问题标题】:Different output for same code in C++14 and c++17 [duplicate]C ++ 14和c ++ 17中相同代码的不同输出[重复]
【发布时间】:2020-04-01 19:48:40
【问题描述】:

对于相同的 c++ 代码,但在不同版本的 c++ 中,我得到了不同的答案 即 c++14 和 c++17

从 c++14 到 c++17 的变化是什么,因此我得到了不同的答案?

(与这个问题特别相关)

#include<iostream>

using namespace std;

int main()
{
    int i = 1;
    cout << i++ <<" "<< i-- << " " << i--;
    return 0;
}

/*
* Output in c++17
*   1 2 1
*
* Output in c++14
*  -1 0 1
*
*/

【问题讨论】:

  • 这不是未定义的行为吗?
  • @DYZ 是的,它是 UB - 对变量 i 的多个未排序修改。
  • 是的。在同一命令中使用变量时更改变量是未定义的行为,结果无法预测。这种变化可能是因为编译器核心发生了变化。
  • cout &lt;&lt; i++ &lt;&lt;" "&lt;&lt; i-- &lt;&lt; " " &lt;&lt; i--; 在我看来就像undefined behaviour。所以你从来没有对任何特定的结果有任何合理的期望。 任何结果都是允许的。
  • @Yksisarvinen 已针对此运算符修复。只是作为规范的欺骗而关闭。

标签: c++ c++14 c++17


【解决方案1】:

C++17 改变了某些表达式的计算顺序规则。

让我们将表达式重写为函数调用中的等价物:

std::operator<<(std::operator<<(std::cout.operator<<(i++), " ").operator<<(i--), " ").operator<<(i--);

在 C++14 中,允许编译器从右到左进行计算,或者以任何嵌套顺序进行计算

要正确支持链接,C++17 states that such expressions are sequenced

例如,std::operator&lt;&lt;(std::cout.operator&lt;&lt;(i++), " ").operator&lt;&lt;(i--) C++17 要求在 i-- 之前评估 i++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2011-07-24
    • 2022-08-13
    • 2012-09-01
    • 2018-06-15
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    相关资源
    最近更新 更多