C コンパイラから以下のテスト コードに対して間違った asm コードを取得しています。これは未定義の動作によるものですか?
void SimulatedTest(void)
{
if ( (a) || (b && c || d) == 1 )
{
i = 2;
}
else
{
i = 4;
}
}
基準とは:
6.5.16 代入演算子
オペランドの評価順序は規定されていません。代入演算子の結果を変更したり、次のシーケンス ポイントの後にアクセスしようとした場合の動作は未定義です。
C 演算子の優先順位規則
- ()
- ==
- || &&
問題の場合: if ( (a) || (b && c || d) == 1 ) コンパイラは次の順序で式を評価し、間違ったコードを生成します
1.(b && c || d) -->R1
2.R1 == 1 -->R2
3.(a) || R2
ただし、コンパイラは以下の場合に正しいコードを生成します
ケース 1: . 関係「==」演算がない場合
if ( (a) || (b && c || d) )//compiler generates expected code
ケース 2:論理 OR 演算に括弧を追加する場合
if ( ((a) || (b && c || d)) == 1 )//compiler generates expected code
ケース 3:演算間に括弧を使用しない
if ( a || b && c || d == 1 )//compiler generates expected code
問題のケースが未定義の動作カテゴリに該当するかどうかを知りたいです。
よろしく、
マック