澄清C算子相关性

问题描述 投票:2回答:3

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

“...在x = f()+ g()等表达式中;

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

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

c
3个回答
1
投票

只有在没有它们的情况下编写一个含糊不清的构造时,关联性和运算符优先级才有意义。在a + b * c中,运算符优先级要求首先评估b * c。在a + b + c中,关联性要求首先评估a + b,当程序可以区分时(例如当abc是浮点值时)。

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

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


2
投票

但是,根据优先级和关联规则,函数调用是否具有最高优先级?

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

并且,由于函数调用operator()的关联性是从“从左到右”,不应该在g()之前调用f()(绝对)?

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.