运营商计算方向

ami*_*iad 7 c++

我遇到了一些我无法理解的东西.

我有这个代码:

cout << "f1 * f1 + f2 * f1 - f1 / f2 is: "<< f1 * f1 + f2 * f1 - f1 / f2 << endl;
Run Code Online (Sandbox Code Playgroud)

所有"f"都是对象,所有运算符都被重载.

奇怪这是第一计算是的/操作者,则第二*,然后第一*; 在那之后,操作员+和最后,操作员-.

所以基本上,/*从右到左的工作,并+-从左至右的操作人员.

我做了另一个测试...我检查了这段代码:

 cout << "f1 * f1 / f2 is: " << f1 * f1 / f2 << endl;
Run Code Online (Sandbox Code Playgroud)

现在,第一个运营商是*,然后只有运营商/.所以现在,它从左到右工作.

有人可以帮助我理解为什么方向上存在差异?

10X!

小智 10

这又是一个关于函数参数评估顺序的问题--C++没有指定这样的顺序.您的代码相当于:

(f1 * f1) + (f2 * f1) - (f1 / f2)
Run Code Online (Sandbox Code Playgroud)

可以按任何顺序评估三个乘法和除法运算.对于命名函数来说,这可能更为明确:

add(f1*f2,f2*f1)).minus(f1/f2);
Run Code Online (Sandbox Code Playgroud)

底线是关联性和优先级对于函数参数和/或子表达式的评估顺序没有任何说明.给出简单的表达式:

a + b
Run Code Online (Sandbox Code Playgroud)

C++(和C)编译器可以自由地评估第一个,然后是b,或者首先是a,然后是a,无论'+'是否过载.