我得到错误的汇编代码从C编译器下面的测试代码。 这是由于未定义的行为?评估顺序:未定义的行为?或编译器缺陷?
void SimulatedTest(void)
{
if ((a) || (b && c || d) == 1)
{
i = 2;
}
else
{
i = 4;
}
}
什么标准说:
6.5.16赋值运算符
操作数的评价的顺序是不确定的。如果试图 作出修改赋值运算符的结果,或者下一个序列点之后访问它 ,行为是不确定
C运算符优先级规则
- ()
- ==
- || & &
对于该问题的情况下:如果((A)||(B & &Ç|| d)== 1) Compiler将评估以下顺序在表达和产生错误的代码
1.(b & &ç|| 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
想知道这个问题是否情况下,不确定的行为属于类或不。
问候,
的Mac
关于您的_C运算符优先级rule_:'&&'的优先级高于'||',因此它们不必位于同一行上 – Garf365
如果您想要,您似乎缺少一组圆括号得到你的'预期结果' – Shark
寻求调试帮助的问题(“为什么不是这个代码工作?”)必须包括所需的行为,特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:如何创建最小,完整和可验证示例。 – Olaf