订单与关联性

时间:2011-02-25 09:55:19

标签: c++

  

可能重复:
  cout << order of call to functions it prints?

评估复合表达式时,顺序和结合性之间有什么区别?

在以下示例中,我没有看到顺序对表达式result的影响。 result总是3,就像从左到右调用函数一样,算术运算符是左关联的。

#include <iostream>
using std::cout;
using std::endl;

int Func1(int &i)
{
    return i;
}

int Func2(int &i)
{
    return i++;
}

int main()
{
    for (int index = 0; index < 999999999; index++)
    {
        int i = 0;

        int result = (Func2(i) + Func1(i) + Func1(i) + Func2(i));

        cout << result << endl;
    }
}

2 个答案:

答案 0 :(得分:4)

 int result = (Func2(i) + Func1(i) + Func1(i) + Func2(i));

语言未指定调用这些函数的顺序!

C ++标准(2003)中的$ 5/4部分读取,

  

除非另有说明,否则的顺序   评估个人的操作数   运算符和子表达式   个人表达和秩序   发生副作用的是   的不确定

所以免费的建议是:避免编写这样的代码。它们是不便携的!

答案 1 :(得分:0)

如果您使用具有相同编译选项的相同编译器多次运行代码,结果很可能相同。但是,如果您更改选项或尝试其他编译器,则可能会得到不同的结果。

由于在int上只使用了简单的函数,因此以不同的顺序调用函数没有什么好处,所以从左到右或从右到左都是显而易见的选择。而你的测试代码无法区分! : - )