複合式の複数のオペランドが同じオブジェクトを変更する場合、それは未定義の動作であるとどこかで読んだことを漠然と覚えています。
この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だと言っているのかを教えてくれたらありがたいです。