在下面的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;
之类的行。我不确定我是否应该担心它。
答案 0 :(得分:3)
在C ++ 11之前,两种形式都是完全未定义的,因为它们都写入相同的内存位置而没有插入序列点。
根据链接问题So why is i = ++i + 1 well-defined in C++11?,第一种形式在C ++ 11中是合法的,因为写入顺序更加有限。
我认为第二种情况没有明确定义,因为未指定对=
的操作数的评估顺序。
幸运的是,所有这些问题都可以通过永远不会编写任何类似于此的代码来避免。您未来的代码维护者会感谢您,并向您发送未来的礼物。