评估复合表达式时,顺序和结合性之间有什么区别?
在以下示例中,我没有看到顺序对表达式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;
}
}
答案 0 :(得分:4)
int result = (Func2(i) + Func1(i) + Func1(i) + Func2(i));
语言未指定调用这些函数的顺序!
C ++标准(2003)中的$ 5/4部分读取,
除非另有说明,否则的顺序 评估个人的操作数 运算符和子表达式 个人表达和秩序 发生副作用的是 的不确定强>
所以免费的建议是:避免编写这样的代码。它们是不便携的!
答案 1 :(得分:0)
如果您使用具有相同编译选项的相同编译器多次运行代码,结果很可能相同。但是,如果您更改选项或尝试其他编译器,则可能会得到不同的结果。
由于在int上只使用了简单的函数,因此以不同的顺序调用函数没有什么好处,所以从左到右或从右到左都是显而易见的选择。而你的测试代码无法区分! : - )