我正在读“The C Programming Language”一书,我遇到了以下几行(释义):
“...在x = f()+ g()等表达式中;
f()可能在g()之前调用,反之亦然。 C没有指定评估操作数的顺序......“
但是,根据优先级和关联规则,函数调用是否具有最高优先级?并且,由于函数调用运算符()
的关联性是从“从左到右”,所以不应该在f()
之前调用g()
(绝对)?
只有在没有它们的情况下编写一个含糊不清的构造时,关联性和运算符优先级才有意义。在a + b * c
中,运算符优先级要求首先评估b * c
。在a + b + c
中,关联性要求首先评估a + b
,当程序可以区分时(例如当a
,b
和c
是浮点值时)。
在f() + g()
中,运算符优先级确实进入了它;它说f
和g
是被调用的函数,而不是f
和f() + g
,如果加法具有更高的优先级会发生什么,并且它还说两个函数调用在加法之前发生。然而,相关性是无关紧要的,因为增加是在中间。我认为甚至不可能用函数调用运算符编写等效的a + b + c
,因为函数调用运算符是非对称的。
关联性和运算符优先级都不控制首先评估哪个函数调用。您唯一的保证是首先评估其中一个 - 如果您有任何方法可以观察到这一点,则它们的执行不能交错。
但是,根据优先级和关联规则,函数调用是否具有最高优先级?
函数调用具有最高优先级。这意味着在评估“+”之前将评估f()和g()。这并不意味着将在g()之前或之后评估f()。
并且,由于函数调用operator()的关联性是从“从左到右”,不应该在g()之前调用f()(绝对)?
不,它不应该。 operator()具有从左到右的关联性。这意味着在表达式f(x)(y)
中(如果函数f
返回另一个函数,可以在C中使用它),首先计算f(x)
,然后将得到的函数应用于y
。这并不意味着将在g()之前或之后评估f()。
这不是您所指的方式的优先级或关联性的情况。
简单地说,f()
和g()
将在应用+
之前以任何顺序进行评估,然后将其结果添加到x
中。