【发布时间】:2016-12-03 23:54:33
【问题描述】:
我从 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
想知道问题案例是否属于未定义的行为类别。
问候,
苹果机
【问题讨论】:
-
关于您的 C 运算符优先级规则的评论:
&&的优先级高于||,因此它们不必在同一行跨度> -
如果你想得到你的“预期结果”,你似乎缺少一组括号
-
寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
-
如果您认为任何答案回答了您的问题,请考虑接受(答案左侧的灰色复选标记)。
标签: c undefined-behavior ansi unspecified-behavior