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 之前)。
代码:
int a = 0;
a = ++a % 5;
引起警告:
warning: operation on 'a' may be undefined [-Wsequence-point]
a = ++a % 5;
~~^~~~~~~~~
在使用 -Wall
但是这段代码可以正常工作吗?
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 之前)。