这是我的问题:
int addsomeStuff(std::ostream &cout, int b) {
cout << b;
return 2;
}
int main() {
int a = 1;
cout << a << addsomeStuff(cout, 3) << endl;
return 0;
}
Output: 312
有人可以向我解释输出结果吗,我希望输出结果更像132 为什么编译器在生成运算符之前先运行Function。
我如何遇到此问题: 我有一个容器类,可以在一个字节数组中保存数据。 以某种方式“ container.WriteConvert(..);”被插入到名为“ a”的整数之前的字节数组中。有人对此有解释吗?
我可以将WriteConvert设置为静态,或者添加一条额外的可以解决此问题的行,而不是返回Container&,但是我很想知道编译器将其按此顺序放置的原因。>
int a = 2;
Container container;
container << a << container.WriteConvert("TestString");
int b = 0;
container >> b;
cout << b;
// The ouput of 'b' is some stupid Data which is caused by WriteConvert.
我没有写此WriteConvert静态或在Container类之外的原因有某些原因。我也有ReadConvert,我不想有多行。如果有人有其他想法,我愿意接受其他解决方案,而不会增加行数。
int b = 0;
string output
container >> b >> container.ReadConvert(output);
cout << b;
答案 0 :(得分:0)
在C++17
之前,链接的运算符参数的求值的顺序是未指定。这意味着执行程序可能首先评估了addsomeStuff(cout, 3)
调用(因此首先打印3
),然后继续打印a
和返回值addsomeStuff(cout, 3)
。
使用C++17
,可以明确定义评估的顺序-从左到右。这意味着,如果编译器正确实现了C++17
标准,则唯一可能的输出是132
。
如果您坚持使用C++17
之前的标准,则需要首先评估所有参数,然后在链式运算符调用中使用它们,或者不要使用链式运算符调用:
int main() {
int a = 1;
cout << a;
cout << addsomeStuff(cout, 3) << endl;
return 0;
}
前一种方法可能会改变行为,但定义明确。