【问题标题】:Clarification of C Operator AssociativityC 运算符关联性的说明
【发布时间】:2017-01-12 00:53:22
【问题描述】:

我正在阅读“C 编程语言”一书,我遇到了以下行(释义):

"...在表达式中,例如 x = f() + g();

f() 可能在 g() 之前调用,反之亦然。 C没有指定顺序 将在其中计算操作数..."

但是,根据优先级和关联规则,函数调用不是具有最高优先级吗?而且,由于函数调用运算符() 的关联性是从“左到右”,不应该在g() 之前调用f()(绝对)?

【问题讨论】:

  • 函数调用从左到右关联。因此,函数运算符与f 而不是+ 相关联。下一个求值是加法运算符,对its个操作数的求值顺序没有指定;因此,可以先调用任何一个。
  • 本书试图解释你不应该依赖于一个函数的副作用。
  • 这与优先级或关联性无关。问题是+ 的操作数以未指定的顺序进行评估。优先级指定哪些操作数与哪些运算符相关联;它没有指定在运行时计算这些操作数的顺序。

标签: c


【解决方案1】:

但是,根据优先级和关联规则,不起作用 调用具有最高优先级?

函数调用具有最高优先级。这意味着 f() 和 g() 都将在评估“+”之前进行评估。这并不意味着 f() 将在 g() 之前或之后计算。

而且,由于函数调用运算符 () 的结合性来自 “从左到右”,f() 不应该在 g() 之前调用吗?

不,不应该。运算符 () 具有从左到右的关联性。这意味着在表达式f(x)(y) 中(如果函数f 返回另一个函数,则可以在C 中使用),首先计算f(x),然后将结果函数应用于y。这并不意味着 f() 将在 g() 之前或之后计算。

【讨论】:

    【解决方案2】:

    关联性和运算符优先级仅在您可以编写一个没有它们时模棱两可的构造时才重要。在a + b * c 中,运算符优先级要求首先评估b * c。在a + b + c 中,关联性要求首先评估a + b,此时程序可以分辨出差异(例如当abc 是浮点值时)。

    f() + g() 中,运算符优先级确实有点;它说fg 是被调用的函数,而不是ff() + g,如果加法具有更高的优先级会发生这种情况,它还说这两个函数调用都发生在加法之前.但是,关联性无关,因为加法在中间。我认为用函数调用运算符编写与a + b + c 等效的函数甚至可能,因为函数调用运算符是不对称的。

    关联性和运算符优先级都不能控制首先评估哪个函数调用。您唯一的保证是首先评估其中的一个——如果有任何方法可以让您观察到这一点,则它们的执行不能交错。

    【讨论】:

      【解决方案3】:

      这既不是您提到的优先级或关联性的情况。
      简单地说,f()g() 将在应用+ 之前以任何顺序进行评估,然后将它们的结果相加以产生x

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 2012-04-01
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        相关资源
        最近更新 更多