拿这个玩具计划来说:
int main()
{
int a = 1;
a = ++a ;
}
具有gcc 9.3汇编输出的-Wall -std=c++17
(甚至主干):
<source>:4:5: warning: operation on 'a' may be undefined [-Wsequence-point]
4 | a = ++a ;
| ~~^~~~~
我知道在过去确实是一个问题,但对同一个问题的不同回答指出了C++17标准中固定的部分,即在分配操作中,rhs是在实际分配之前进行排序的:
8.18。..。在所有情况下,分配都是在计算右和左操作数的值之后,以及在分配表达式的值计算之前进行的。
所以这个警告真的是假的还是我漏掉了什么?
发布于 2020-03-31 08:52:10
正如在另一个答案中已经提到的,代码行为良好,对于C++17来说这条信息是假阳性的,但我想补充一点,GCC仍然有意警告它。
GCC文献声明-Wsequence-point
警告标志(由-Wall
启用):
C++17标准将在更多的情况下定义操作数的计算顺序:特别是它要求在左侧之前计算赋值的右侧,因此上述示例不再是未定义的。但是,这个选项仍然会对它们发出警告,以帮助人们避免编写C和C++早期版本中未定义的代码。
所以这个程序给出了警告。
https://stackoverflow.com/questions/60937761
复制相似问题