これは未定義の動作であることを理解しています:
int i = 0;
int a[4];
a[i] = i++; //<--- UB here
i左側と右側のの評価順序が定義されていないためです (;が唯一のシーケンス ポイントです)。
その推論をさらに一歩進めると、これは次のようになると私には思えます未定義未指定の動作:
int i = 0;
int foo(){
return i++;
}
int main(){
int a[4];
a[i] = foo();
return 0;
}
の右側にいくつかのシーケンスポイントがありますが、=私が理解している限りではまだです未定義またはが最初に評価されるかどうf()かは指定されていません。a[i]
私の仮定は正しいですか?代入の左側でグローバル変数または静的変数を使用し、右側がそれを変更しない場合、細心の注意を払う必要がありますか?