1

x在以下 C++ 代码中,最后的值和值之间是否存在差异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;. 我不确定我是否应该担心。

4

1 回答 1

3

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

根据链接的问题,为什么 i = ++i + 1 在 C++11 中定义良好?由于写入顺序受到更多限制,第一种形式在 C++11 中是合法的。

我相信第二种情况没有很好地定义,因为=没有指定操作数的评估顺序。

幸运的是,所有这些问题都可以通过从不编写与此类似的代码来避免。你未来的代码维护者会感谢你,并从未来给你送礼物。

于 2015-07-17T16:11:01.883 回答