澄清C算子相关性

时间:2017-01-12 00:53:22

标签: c

我正在阅读“ The C Programming Language ”一书,我遇到了以下内容(释义):

  

“......在x = f()+ g();

等表达式中      

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

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

3 个答案:

答案 0 :(得分:2)

  

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

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

  

并且,因为函数调用operator()的关联性来自   “从左到右”,不应该在g()(绝对)之前调用f()吗?

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

答案 1 :(得分:1)

这不是你所指的方式的优先或相关性的情况 简单地说,f()g()将在应用+之前以任何顺序进行评估,然后将添加其结果以生成x

答案 2 :(得分:1)

关联性和运算符优先级仅在您可以编写没有它们时不明确的构造时才有意义。在a + b * c中,运算符优先级要求首先计算b * c。在a + b + c中,当程序可以区分时(例如a + bab何时浮动时,关联性需要首先评估c点值)。

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

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