C ++“值++”会引起警告,但“值+1”不会吗?

Hex*_*own 4 c++ compiler-warnings

代码:

int a = 0;
a = ++a % 5;
Run Code Online (Sandbox Code Playgroud)

引起警告:

warning: operation on 'a' may be undefined [-Wsequence-point]
a = ++a % 5;
~~^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

与各种编译器一起使用时,例如gcc -Wall

这段代码行得通吗?

int a = 0;
a = (a + 1) % 5;
Run Code Online (Sandbox Code Playgroud)

为什么这是警告,并且可以安全地忽略它?

将其包装在方括号等中似乎并不能消除警告。

编辑:为澄清起见,当我看到这些警告消息时,我正在使用C ++ 17编译器。

L. *_* F. 9

a = ++a % 5;
Run Code Online (Sandbox Code Playgroud)

a被修改两次。在C ++ 11之前,这是未定义的行为-未指定在分配之前提交增量。从C ++ 11开始,保证首先对RHS的副作用进行评估,并a保证为1

a = (a + 1) % 5;
Run Code Online (Sandbox Code Playgroud)

在这里,a仅被修改一次。结果a保证为1


每条评论:运算符优先级不能确定评估顺序。尽管赋值的优先级更高,但评估顺序仍未指定(在C ++ 11之前)。