代码:
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编译器。
答案 0 :(得分:9)
a = ++a % 5;
a
被修改了两次。在C ++ 11之前,这是未定义的行为-未指定在分配之前提交增量。从C ++ 11开始,可以保证首先评估RHS上预递增的副作用,并保证a
为1
。
a = (a + 1) % 5;
在这里,a
仅被修改了一次。结果a
被保证为1
。
每个注释:运算符优先级不能确定评估的顺序。尽管赋值的优先级更高,但评估顺序仍未指定(在C ++ 11之前)。
答案 1 :(得分:2)
编辑:
在C ++ 11之前:因为使用++a
时要修改a
,而要通过赋值来修改a
,因此行为是不确定的。
在C ++ 11之后:请参阅@ L.F。的答案。