输出流中的函数调用优先级



因此,我有以下类:

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是Ratio类型,右端的函数首先被调用,因此它显示更新的比率,但显示未更新的值:

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((之间求值

正如user@super所指出的,从c++17开始,现在定义了移位运算符的求值顺序。它隐藏在我上面链接的页面上的规则项目符号19(中。所以,如果你能用c++17,你就完了。

将值也放入<lt;像这样的过载功能

friend ostream& operator<<(ostream &out,const Ratio &R){return (out<<"R = "<<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 = "<<R.num<<':'<<R.den<<"tvalue = "<<R.val);}
};
int main()
{
Ratio R;
cout<<R.update(2,1)<<endl;
}

输出:

R = 2:1 value = 2
Process returned 0 (0x0)   execution time : 0.382 s
Press any key to continue.

最新更新