cout内函数的调用顺序

4

我想要知道cout语句内函数的执行顺序。

我尝试了以下代码:

#include < iostream >
using namespace std;
int i=0;
int sum(int a)
{
    i++;
    return a+i;
}
int main()
{
    cout << sum(3) << sum(2) ;
    return 0;
}

我预期输出应该是44,但实际输出是53。
1个回答

5
根据这里所述:https://en.cppreference.com/w/cpp/language/eval_order

任何表达式的任何部分,包括函数参数的评估顺序都是未指定的(有一些例外情况在下面列出)。编译器可以以任何顺序评估操作数和其他子表达式,并且在再次评估相同表达式时可能选择另一种顺序。

C ++中没有从左到右或从右到左的求值概念。这不应与运算符的从左到右和从右到左的结合性混淆:由于operator +的从左到右结合性,表达式a() + b() + c()被解析为(a() + b()) + c(),但是在运行时对c的函数调用可以首先、最后或在a()或b()之间进行评估。

在你的那一行中

cout << sum(3) << sum(2)

两个operator<<调用的顺序取决于您使用的运算符(此处为<<,因此从左到右),但每个子表达式的评估,即sum(3)sum(2)的评估顺序未定义,取决于编译器的心情(通常是最优化的编译方法)。
附带信息:这里是一份运算符结合性列表:https://en.cppreference.com/w/cpp/language/operator_precedence

但如果它的执行是随机的,它应该至少打印一次44,但它没有,尽管我至少编译了20次。 - ankur suman
3
不是"随机的",而是"任意的"。也就是说,对于特定编译器的顺序没有具体规定,但肯定会有一定的顺序。 - Nicol Bolas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接