我遇到了一些我无法理解的东西.
我有这个代码:
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,无论'+'是否过载.