预增量运算符的位置是否会产生差异?

时间:2015-07-17 15:41:20

标签: c++ pre-increment coverity

在下面的C ++代码中,最后xy的值是否存在差异?

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;之类的行。我不确定我是否应该担心它。

1 个答案:

答案 0 :(得分:3)

在C ++ 11之前,两种形式都是完全未定义的,因为它们都写入相同的内存位置而没有插入序列点。

根据链接问题So why is i = ++i + 1 well-defined in C++11?,第一种形式在C ++ 11中是合法的,因为写入顺序更加有限。

我认为第二种情况没有明确定义,因为未指定对=的操作数的评估顺序。

幸运的是,所有这些问题都可以通过永远不会编写任何类似于此的代码来避免。您未来的代码维护者会感谢您,并向您发送未来的礼物。