-1 c ansi undefined-behavior unspecified-behavior
我从C编译器得到以下测试代码的asm代码错误.这是由于未定义的行为?
void SimulatedTest(void)
{
if ( (a) || (b && c || d) == 1 )
{
i = 2;
}
else
{
i = 4;
}
}
Run Code Online (Sandbox Code Playgroud)
标准说:
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
Run Code Online (Sandbox Code Playgroud)
情况2:为逻辑OR运算添加括号时
if ( ((a) || (b && c || d)) == 1 )//compiler generates expected code
Run Code Online (Sandbox Code Playgroud)
案例3:操作之间没有使用括号
if ( a || b && c || d == 1 )//compiler generates expected code
Run Code Online (Sandbox Code Playgroud)
想知道问题案例是否属于未定义的行为类别.
问候,
苹果电脑
等式运算符的==
优先级高于逻辑||
运算符或运算符.因此编译器是正确的,并且没有未定义的行为.
评估与以下内容相同:
a || ( ( b && c || d ) == 1 )
Run Code Online (Sandbox Code Playgroud)