gpt4 book ai didi

c++ - 成员(member)调用接线员<<

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:01 28 4
gpt4 key购买 nike

这是我的问题:

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为什么编译器在生成运算符之前首先运行函数。

我是如何遇到这个问题的:我有一个容器类,可以将数据保存在字节数组中。不知何故 'container.WriteConvert(..);'在名为“a”的整数之前插入字节数组。有没有人对此有解释。

我可以使 WriteConvert 静态或添加一个额外的行这将解决这个问题,而不是返回一个 Container& 但我有点感兴趣编译器按此顺序放置它的原因是什么。 p>

    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 static 或在 Container 类之外的原因是有一些原因的。我也有 ReadConvert,我不想有多行。如果有人有其他想法,我愿意接受其他解决方案,而不会增加行数。

    int b = 0;
string output
container >> b >> container.ReadConvert(output);
cout << b;

最佳答案

C++17 之前,链式运算符参数的求值顺序未指定。这意味着执行可以首先评估 addsomeStuff(cout, 3) 调用(因此首先打印 3)然后继续打印 aaddsomeStuff(cout, 3) 的返回值。

C++17 中,求值的顺序是明确定义的 - 从左到右。这意味着如果您的编译器正确实现了 C++17 标准,则唯一可能的输出是 132

如果您受困于 C++17 之前的标准,您需要首先评估所有参数,然后在链式运算符调用中使用它们不要t 使用链式运算符调用:

int main() {
int a = 1;
cout << a;
cout << addsomeStuff(cout, 3) << endl;
return 0;
}

前一种方法可能会改变行为,但会得到明确定义。

关于c++ - 成员(member)调用接线员<<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57939628/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com