【问题标题】:Associativity in CC中的关联性
【发布时间】:2026-02-07 16:20:08
【问题描述】:
#include <stdio.h>
int main()
{
    int a=10,b=20,c=30,d=40;
    
    
    if(a<=b == d>c)
    {
        printf("true");
    }
    else
    {
        printf("false");
    }
}

对于上面的代码,关联性会出现在图片中,因为 运算符具有相同的优先级。 所以我可以说(从左到右)将在这种情况下被评估

【问题讨论】:

  • 为什么不直接写if( (a&lt;=b) == (d&gt;c) ) 并完成它?
  • ^^^^^^^^ 当您可以明确定义所需内容时,谁会关心关联性和检查优先级表?我发誓有些用户(或他们的教授)实际上对括号过敏:)
  • 啊——不确定排序。 (谢谢)

标签: c operator-precedence


【解决方案1】:

运算符优先级/关联性指定哪些运算符与哪个操作数“粘合在一起”。在这种情况下,他们指定应该将表达式解析为 (a&lt;=b) == (d&gt;c) 而不是 a&lt;= (b==d) &gt;c 等。

由于关系运算符的优先级高于等式运算符,因此在这里关联性并不重要。仅当您写过类似a &lt;= b &gt; c 的内容时才有意义。

此外,不要将运算符优先级与评估顺序混为一谈。在这种情况下,a&lt;=b 表达式或d&gt;c 表达式可能首先被求值,因为== 运算符没有指定其操作数的求值顺序。这是未指定的行为,可能因情况而异。

详情见What is the difference between operator precedence and order of evaluation?

【讨论】:

  • 所以,int z =x++ + ++x;即使在这种情况下,我们也不确定执行顺序..是先执行 x++ 还是 ++x..完全取决于编译器来选择哪个先执行???
  • 对于像'int z =x++ + ++x;'这样的代码,编译器应该简单地着火试图杀死编写代码的用户。
  • @narayanrathod 这个特定的例子将是有史以来排名第一的 C 常见问题解答。这是一个不好的例子,因为它只是未定义的行为,您对此一无所知。见Why can't we mix increment operators like i++ with other operators?
  • @narayanrathod:该示例的问题在于调用了未定义的行为。一个更好的例子是x = f() + g(); - 不能保证f()g() 之前被调用,反之亦然。唯一强制从左到右求值的运算符是 &amp;&amp;||?: 和逗号运算符(与分隔函数参数的逗号不同)。