操作数求值顺序的矛盾

5
当我从Deitel C学习C语言中的递归函数时,我读到了这句话:
标准C并没有规定大多数运算符(包括+)的操作数应该按照什么顺序进行评估。
但是书中也说:
'+'的结合性是从左到右的。
操作数的评估顺序:

order of evaluation of operands

有人能解释为什么吗?

1个回答

8

求值顺序和结合性是两个不同的概念,以以下示例为例:

int x = func1() - func2() - func3(); //having int return types

在这个表达式中,无法知道func1()将首先还是最后被计算,也就是说,你不知道哪个函数会被首先调用并返回其值,但是你知道与+类似的结合律将从左到右,首先是func1() - func2()然后是减法结果 - func3()
在C语言中没有左到右或右到左计算的概念,这与运算符的从左到右和从右到左的结合方式不同:由于operator+的左到右结合性,表达式f1() + f2() + f3()被解析为(f1() + f2()) + f3(),但是在运行时,对f3()的函数调用可能首先、最后或在f1()f2()之间评估。
参考资料:https://en.cppreference.com/w/c/language/eval_order

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接