建议不要在单个表达式中多次修改对象,也不要在同一表达式中修改对象后使用该对象。
int i = 0;
++++i; // UB
++i = i++; // OK?
那么你觉得呢?你能向我解释一下最后一个表达式中的
i
应该是什么值吗?我知道这样做的设计很糟糕,但这只是为了教育目的。谢谢你。
++i = i++;
我仍然收到相同的警告:
g++ main.cpp -std=c++17 -o prog -Wall -pedantic
++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=
在 C++17 中有效,++i = i++
排序在 i++
之前。在 C++17 之前,正如你所写,它是 UB。