【发布时间】:2015-10-07 09:33:59
【问题描述】:
在下面的 C++ 代码中,最后 x 和 y 的值有区别吗?
const int LoopLength = 100;
unsigned short x = 0;
for (int i = 0; i < LoopLength; i++)
{
x = ++x % 2;
cout << x;
}
cout << endl;
unsigned short y = 0;
for (int i = 0; i < LoopLength; i++)
{
++y = y % 2;
cout << y;
}
cout << endl << (x == y) << endl;
Coverity(静态分析工具)声称副作用发生的顺序未定义,如x = ++x % 2;。我不确定我是否应该担心。
【问题讨论】:
-
x行还不错,但如果标准未定义顺序,则应将括号括在要首先发生的位上。然而,y分配看起来像是一场等待发生的灾难。这甚至可以编译吗? -
@underscore_d 由于斯蒂芬的链接答案规则,第一行应该定义明确。 preincrement 运算符返回一个可以赋值的glvalue,因此将它放在赋值运算符的左侧是非常好的语法。不过,我觉得围绕操作符的未定义排序会使整体行为未定义。
-
谢谢 - 我只是在阅读解释为什么它可以产生有效的左值并回来编辑我的评论,但我为时已晚。每天都学习新东西 :) 我想我个人会避免它,除非我正在为 IOCCC 写东西!
-
@underscore_d 它编译 =/。我刚刚和一位同事谈过,他看到 y 线后不寒而栗。
标签: c++ pre-increment coverity