我从 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:当为逻辑或运算添加括号时
if ( ((a) || (b && c || d)) == 1 )//compiler generates expected code
案例3:操作之间没有使用括号
if ( a || b && c || d == 1 )//compiler generates expected code
想知道问题案例是否属于未定义的行为类别。
问候,
苹果电脑