预增量运算符的放置在这里会有所不同吗?
Does the placement of a pre-increment operator make a difference here?
在下面的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;
等行定义。我不确定我是否应该担心它。
这两种形式在 C++11 之前是完全未定义的,因为它们都写入相同的内存位置而没有中间序列点。
根据链接的问题 So why is i = ++i + 1 well-defined in C++11? 第一种形式在 C++11 中是合法的,因为写入顺序更受限制。
我认为第二种情况没有明确定义,因为未指定 =
的操作数的评估顺序。
幸运的是,所有这些问题都可以通过永远不会编写任何与此类似的代码来避免。您未来的代码维护者会感谢您并向您发送来自未来的礼物。
在下面的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;
等行定义。我不确定我是否应该担心它。
这两种形式在 C++11 之前是完全未定义的,因为它们都写入相同的内存位置而没有中间序列点。
根据链接的问题 So why is i = ++i + 1 well-defined in C++11? 第一种形式在 C++11 中是合法的,因为写入顺序更受限制。
我认为第二种情况没有明确定义,因为未指定 =
的操作数的评估顺序。
幸运的是,所有这些问题都可以通过永远不会编写任何与此类似的代码来避免。您未来的代码维护者会感谢您并向您发送来自未来的礼物。