【问题标题】:C++: input and output stream operators: associativityC++:输入和输出流运算符:关联性
【发布时间】:2012-07-06 01:53:35
【问题描述】:

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

从左到右

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

【问题讨论】:

    标签: c++ input operators associativity


    【解决方案1】:

    关联性定义了 operator((((std::cout << func0()) << func1()) << func2()) << std::endl);。评估 operator

    【讨论】:

    • jsinger,谢谢你的回答。所以你的意思是关联性和参数评估顺序是不同的东西,虽然第一个是标准定义的,但最后一个 - 在特定的编译器实现上。我说的对吗?
    • 2 杰辛格,大卫。伙计们,两个答案都很棒。很难选择一个放置绿色标记的位置。我决定标记第一个出现的。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。类比——函数参数列表计算顺序。
    • 我认为逗号操作符注释有点牵强,因为它在这里没有使用,实际上几乎没有使用过(在 for 语句之外)。注意逗号分隔参数是NOT逗号操作符。
    • “一个例外是逗号运算符。”和逻辑或运算符。和逻辑与运算符。
    • @BenVoigt 所以有几个例外:)
    • @BenVoigt:你是对的;差不多吧。你忘记了三元运算符。我更正了我的答案。更复杂的是,如果重载,这些运算符不会形成序列点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多