繁体   English   中英

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

[英]Is assignment operator a sequence point under C++17? and what would be the result of this expression?

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

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

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

所以你怎么看? 你能解释一下最后一个表达式中的i应该是什么值++i = i++; ?

我知道这样做的设计很糟糕,但这只是为了教育目的。 谢谢你。

  • 当我针对 C++17 或 C++20 进行编译时: g++ main.cpp -std=c++17 -o prog -Wall -pedantic我仍然收到相同的警告:

     ++i = i++;

这是来自 GCC 的 output:

main.cpp: In function 'int main()': main.cpp:12:12: warning: operation on 'i' may be undefined [-Wsequence-point] 12 | ++i = i++; | ~^~ 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=或用户定义调用)时,右侧先于左侧排序。 所以++i = i++在 C++17 中有效, i++++i之前排序。

正如您所写,在 C++17 之前,它是 UB。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM