C ++:输入和输出流操作符:关联性

时间:2012-07-06 01:53:36

标签: c++ input operators associativity

理论上输入/输出流运算符的关联性:

左转

(例如,根据: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执行的标准词相关联?为什么函数执行是按照左右顺序执行的?

2 个答案:

答案 0 :(得分:3)

关联性定义了运算符的顺序&lt;&lt;通过这种方式发生的呼叫:((((std::cout << func0()) << func1()) << func2()) << std::endl);。运算符&lt;&lt;的参数的顺序评估是实现定义但是,iirc,这是你在这里测试的。

答案 1 :(得分:1)

  

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

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

  

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

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