C++:输入和输出流运算符:关联性

C++: input and output stream operators: associativity

本文关键字:运算符 关联性 输出流 输入 C++      更新时间:2023-10-16

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

从左到右

(例如,根据这个:Sait Mary's University网站

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

#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 . . .
此示例演示按从右到左

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

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

关联性定义了运算符<<调用的顺序,这些调用将按以下顺序发生:((((std::cout << func0()) << func1()) << func2()) << std::endl); 。但是,运算符<<参数的计算顺序是实现定义的,iirc,这是您在此处测试的内容。

此代码示例如何与有关从左到右执行的标准字词相关联?

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

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

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