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

C++ 输出流中的函数调用优先级,c++,class,stream,member,C++,Class,Stream,Member,因此,我有以下课程: 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

因此,我有以下课程:

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), cout<<"\tvalue = "<<R.v();

<代码> CUT< P>因为C++中没有保证的评估顺序,它不会在没有拆分成单独的部分的情况下工作,就像您在FIX中所做的那样。p> 引用

<>在C++中没有左到右或左到右的评价概念。这不能与运算符的从左到右和从右到左的关联性相混淆:由于运算符+的从左到右的关联性,表达式a()+b()+c()被解析为(a()+b())+c(),但对c的函数调用可以在运行时首先、最后或在a()或b()之间求值


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

也可以用任何方式输入值来指示编译器,以何种方式来计算它的参数,这当然是一种方法,但我希望这两件事在需要时分开打印,如果没有分开的调用,正如演示的那样,是编写您正在处理的实际代码,还是这只是一个玩具示例?求值顺序在
c++17
中更新。使用该标准,您的代码将得到很好的定义。有关详细信息,请参阅。@super啊,你说得对!不知何故,我没有看到这一点(19)。。。我将更新我的答案。@florestan代码的一部分,省略了与问题无关的大部分代码
R = 2:1    value = 1
cout<<"R = "<<R.update(2,1), cout<<"\tvalue = "<<R.v();
 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.