C++17下赋值运算符是序列点吗?这个表达式的结果是什么? [重复]

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

建议不要在单个表达式中多次修改对象,也不要在同一表达式中修改对象后使用该对象。

 int i = 0;
 ++++i; // UB

 ++i = i++; // OK?
  • 我认为最后一个表达式在C++17标准之前是UB,但现在我想它是可以的,因为赋值运算符已经成为一个序列点。

那么你觉得呢?你能向我解释一下最后一个表达式中的

i
应该是什么值吗?
我知道这样做的设计很糟糕,但这只是为了教育目的。谢谢你。

    当我针对 C++17 或 C++20 进行编译时:
  • ++i = i++;

    我仍然收到相同的警告:

    g++ main.cpp -std=c++17 -o prog -Wall -pedantic

    
    
  • 这是 GCC 的输出:

++i = i++;

.

    

c++ c++17 assignment-operator sequence-points
1个回答
3
投票
main.cpp: In function ‘int main()’: main.cpp:12:12: warning: operation on ‘i’ may be undefined [-Wsequence-point] 12 | ++i = i++; | ~^~

调用(或任何其他

operator=
调用 - 内置
operator@=
或用户定义的调用)时,右侧先于左侧排序。因此
operator=
在 C++17 中有效,
++i = i++
排序在
i++
之前。
在 C++17 之前,正如你所写,它是 UB。

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