未定義の動作とシーケンス ポイントに関するこのSO C++ FAQを読み、少し実験しました。次のコードgcc-4.5.2
では、コード コメントで言及されている行でのみ警告が表示されますが、その前の 1 行も未定義の動作を示していますね。加算のどのオペランドが最初に実行されるかはわかりません (+
シーケンス ポイントがないため)。gcc がこの行でも警告を表示しないのはなぜですか?
int i=0;
int j=0;
int foo(void) {
i=1;
return i;
}
int main(void) {
i = i + foo();
j = j + (j=1); //Here is a rightly warning
return 0;
}
助けてくれてありがとう。