c - 求值顺序 : undefined behavior? 还是编译器缺陷?

标签 c undefined-behavior ansi-c unspecified-behavior

我从 C 编译器中得到了错误的以下测试代码的 asm 代码。 这是由于未定义的行为吗?

void SimulatedTest(void)
{                                   
    if ( (a) || (b && c || d) == 1 )
    {
        i = 2;
    }
    else
    {
        i = 4;
    }
}

标准的规定:

6.5.16 赋值运算符

The order of evaluation of the operands is unspecified. If an attempt is made to modify the result of an assignment operator or to access it after the next sequence point, the behavior is undefined

C 运算符优先级规则

  1. ()
  2. ==
  3. || &&

对于问题案例: 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

想知道问题案例是否属于未定义的行为类别。

问候,

苹果电脑

最佳答案

相等运算符== 的优先级高于逻辑或|| 运算符。因此编译器是正确的并且不存在未定义的行为。

评估结果与:

a || ( ( b && c || d ) == 1 )

关于c - 求值顺序 : undefined behavior? 还是编译器缺陷?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38655856/

相关文章:

c - 与 while 语句相关的 GCC 编译错误

c - C 中的错误段错误核心转储 - Ubuntu

c++ - 悬空引用和未定义行为

C++ 未定义行为与否? (再次)

c - ISO C89 中 strcpy 的替代方案

c - 如何抑制 int main(void) 函数的 PC-Lint Note 970?

c - 如果文件不存在,则用 C 创建并写入

c - C中是否允许这种函数调用

c - C中的所有函数都是全局的吗?

c - 在循环列表中添加节点