所以,我有以下课程:
typedef double decimal;
class Ratio {
int num, den;
decimal val;
public:
Ratio() { num = 1, den = 1, val = (decimal)num / den; }
Ratio update(int a, int b) {
num *= a, den *= b;
val = (decimal)num / den;
return *this;
}
decimal v(void) { return val; }
friend ostream &operator<<(ostream &out, const Ratio &R) {
return (out << R.num << ':' << R.den);
}
};
当我在输出流中将成员函数用作:
cout<<"R = "<<R.update(2,1)<<"\tvalue = "<<R.v();
其中R是比率类型,首先调用最右端的函数,以便它显示更新的比率,但显示未更新的值:
R = 2:1 value = 1
我通过将流分成两部分来克服了这个问题:
cout<<"R = "<<R.update(2,1), cout<<"\tvalue = "<<R.v();
,以便我“强制” .update()首先被调用。仅使用一个流进行输出,还有另一种方法可以实现这一点吗?
由于c ++中没有保证的评估顺序,因此如您在修复过程中那样,如果不将评估结果分为多个单独部分,它将无法正常工作。
从cppreference引用
在C ++中没有从左到右或从右到左求值的概念。这不要与运算符的从左到右和从右到左的关联性混淆:表达式a()+ b()+ c()被解析为(a()+ b())+ c( ),因为操作符+的从左到右的关联性,但是对c的函数调用可以在运行时首先,最后或在a()或b()之间求值
也将值放在<
friend ostream& operator<<(ostream &out,const Ratio &R){return (out<<R.num<<':'<<R.den<<"\tvalue = "<<R.val);}
现在
#include<iostream> using namespace std; typedef double decimal; class Ratio{ int num,den; decimal val; public: Ratio(){num=1,den=1,val=(decimal)num/den;} Ratio update(int a,int b){ num*=a,den*=b; val=(decimal)num/den; return *this; } friend ostream& operator<<(ostream &out,const Ratio &R){return (out<<R.num<<':'<<R.den<<"\tvalue = "<<R.val);} }; int main() { Ratio R1,R2; cout<<"R = "<<R1.update(2,1)<<endl; }
输出:
R = 2:1 value = 2
Process returned 0 (0x0) execution time : 0.382 s
Press any key to continue.