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

时间:2019-05-23 07:27:48

标签: c++ compiler-warnings

代码:

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编译器。

2 个答案:

答案 0 :(得分:9)

a = ++a % 5;

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

a = (a + 1) % 5;

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


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

答案 1 :(得分:2)

编辑:

在C ++ 11之前:因为使用++a时要修改a,而要通过赋值来修改a,因此行为是不确定的。

在C ++ 11之后:请参阅@ L.F。的答案。