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

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

最佳答案

a = ++a % 5;

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

a = (a + 1) % 5;

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


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

关于C++ "value++"会导致警告但 "value+1"不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56270102/

相关文章:

Java eclipse 突出显示缺少的括号

c++ - 不是所有的控制路径都返回一个值?警告

c++ - C++11 中的 exec 缺少 "missing sentinel"警告

c++ - 为什么 in.good() 与 !in.fail() 不同?

c++ - 如何让 boost::make_shared 成为我类(class)的 friend

c++ - 德语元音变音和正则表达式

c# - 对象初始化程序强制编译错误

c++ - 64 位架构的 iOS JUCE 库问题

c++ - 如何创建迭代器的 QSet

c# - 如果有人使用外部类库中的某些类,我如何报告编译错误