我隐约记得在某处读过,如果复合表达式中的多个操作数修改同一个对象,则这是未定义的行为。
我相信下面的代码中显示了这个 UB 的一个示例,但是我已经在 g++、clang++ 和 Visual Studio 上编译,它们都打印出相同的值,并且似乎无法在不同的编译器中产生不可预测的值。
#include <iostream>
int a( int& lhs ) { lhs -= 4; return lhs; }
int b( int& lhs ) { lhs *= 7; return lhs; }
int c( int& lhs ) { lhs += 1; return lhs; }
int d( int& lhs ) { lhs += 2; return lhs; }
int e( int& lhs ) { lhs *= 3; return lhs; }
int main( int argc, char **argv )
{
int i = 100;
int j = ( b( i ) + c( i ) ) * e( i ) / a( i ) * d( i );
std::cout << i << ", " << j << std::endl;
return 0;
}
这种行为是未定义的,还是我以某种方式想出了一个实际上未定义的假定 UB 的描述?
如果有人可以发布此 UB 的示例,甚至可以指出我在 C++ 标准中说它是 UB 的位置,我将不胜感激。