【问题标题】:What is x after 'x += x--'? [duplicate]'x += x--'之后的x是什么? [复制]
【发布时间】:2019-03-27 10:56:39
【问题描述】:

执行下面的代码后发生了什么;

int x = 10;
x += x--;

我期待结果 19(将 x 添加到 x,然后将 x 减 1)但结果 20。它在窗帘后面是如何工作的?感谢您的回答。

【问题讨论】:

  • 你为什么要写这样的代码?
  • 我得到了 19 个结果。
  • @Cepheus 在 clang、gcc 和 MSVC 上相同:godbolt.org/z/MPrtRN
  • 这是未定义的行为。您可能会得到 19,但不能保证一定会。 GCC 将为int main() { int x = 10; x += x--; } 报告“警告:未排序的修改和访问‘x’[-Wunsequenced]”。
  • @Stephane 投票的目的是标记答案不正确。此处被否决的所有答案(以及现在已删除的答案)都是错误的。努力不会得到分数;你写正确的答案得到积分。

标签: c++ operators post-increment


【解决方案1】:

这种情况下的行为在 C++17 之前是未定义的,参见例如 https://en.cppreference.com/w/cpp/language/eval_order#Undefined_behavior ,所以如果你的编译器不符合它,那么测试或试图理解它是没有用的:它取决于实现,甚至是编译器的版本。

如果您的编译器符合 C++17,则可以保证在简单或复合赋值(= 或例如 +=,分别)中,右侧的所有副作用将在评估之前处理左边。

在您的情况下,x-- 被评估为10 并附带设置x=9 作为其副作用,然后计算机会将10 添加到x=9 导致x=19

感谢 Michał 的更正,我将其纳入答案中。

【讨论】:

    【解决方案2】:

    使用较旧的 c++ 可能无法完成这项工作,因为按照较旧的标准,该行为实际上定义为未定义。 (感谢@LightnessRacesinOrbit)

    如果你只是尝试一个具有最新版本的在线编译器,它工作得很好,结果是你期望的 19(x+=x--x= x+x-- 相同。这意味着获得新的“x ",它必须将旧的 "x"+旧的 "x" -1 相加。所以它会做x+(x--),即x=10+(9)

    试试看here: 与:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int x = 10;
        x += x--;
        cout<<x<<endl;
    }
    

    【讨论】:

    • “可能无法处理”不正确。根据 [旧] 标准,该行为从字面上定义为未定义。这不是编译器的限制,而是 C++ 的指定方式。
    • 好的,谢谢指正!我会立即编辑答案! @LightnessRacesinOrbit
    猜你喜欢
    • 2012-08-15
    • 2023-03-04
    • 2014-02-11
    • 2013-08-29
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多