C++ "value++" 会导致警告但 "value+1" 不会?

C++ "value++" causes warning but "value+1" doesn't?

代码:

int a = 0;
a = ++a % 5;

引起警告:

warning: operation on 'a' may be undefined [-Wsequence-point]
a = ++a % 5;
~~^~~~~~~~~

在使用 -Wall

编译时使用各种编译器,例如 gcc

但是这段代码可以正常工作吗?

int a = 0;
a = (a + 1) % 5;

为什么这是一个警告,可以安全地忽略它吗?

将其括在方括号等中似乎并不能使警告消失。

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

编辑:

在 C++11 之前:因为在 ++a 中,您在通过赋值修改 a 的同时修改 a,因此是未定义的行为。

C++11 之后:参见@L.F. 的回答。

a = ++a % 5;

a修改了两次。在 C++11 之前,这是未定义的行为——没有指定在赋值之前提交增量。从 C++11 开始,pre-increment 对 RHS 的副作用保证首先被评估,a 保证是 1

a = (a + 1) % 5;

这里,a只修改了一次。结果 a 保证是 1.


根据评论:运算符优先级不决定求值顺序。尽管赋值具有更高的优先级,但评估的顺序仍未指定(在 C++11 之前)。