3

理论上的输入/输出流操作符关联性:

左到右

(例如,据此:Sait Mary's University website

实践中的输入/输出流运算符关联性:

#include <iostream>

int func0() {
  std::cout << "func0 executed" << std::endl;
  return 0;
}

int func1() {
  std::cout << "func1 executed" << std::endl;
  return 1;
}

int func2() {
  std::cout << "func2 executed" << std::endl;
  return 2;
}

int main() {
  std::cout << func0() << func1() << func2() << std::endl;
  return 0;
}

输出(MSVCPP 2010、2012):

func2 executed
func1 executed
func0 executed
012
Press any key to continue . . .

此示例演示以从右到左的顺序调用函数(尽管它们的值按预期的从左到右打印)。

问题: 此代码示例如何与关于 LEFT TO RIGHT 执行的标准词相关联?为什么函数执行按从右到左的顺序执行?

4

2 回答 2

3

关联性定义了 operator<< 调用的顺序,它将以这种方式发生:((((std::cout << func0()) << func1()) << func2()) << std::endl);. 评估 operator<< 的参数的顺序是实现定义的,但是 iirc,这就是您在此处测试的内容。

于 2012-07-06T01:56:51.390 回答
1

此代码示例如何与关于 LEFT TO RIGHT 执行的标准词相关联?

根据需要,打印语句的输出为 012。

为什么函数执行按从右到左的顺序执行?

因为这完全取决于实施。除了少数例外,该标准完全没有说明计算运算符参数的顺序。这些例外是逗号运算符、三元运算符a ? b : c和布尔短路运算符&&||。(如果运算符重载,这些不是序列点)。您不应该依赖于计算操作数的顺序。关联性和参数的顺序是不同的概念。

于 2012-07-06T02:11:31.233 回答