请解释一下这种含糊之处?

时间:2012-02-21 12:25:31

标签: c++

  

可能重复:
  Order of evaluation of arguments using std::cout

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

static int series_num;

void setint(int num) {
    series_num = num;
}

int ser() {
    series_num = series_num + 23;
    return series_num;
}

int main() {
    setint(50);
    cout << ser() << " " << ser();
    getchar();
    getchar();
    return 0;
}

给我回报96 73

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

static int series_num;

void setint(int num) {
    series_num = num;
}

int ser() {
    series_num = series_num + 23;
    return series_num;
}

int main() {
    setint(50);
    cout << ser();
    cout << ser() << endl;
    getchar();
    getchar();
    return 0;
}

给我73和96

3 个答案:

答案 0 :(得分:3)

 cout << ser() << " " << ser();

这里有两次ser()来电,没有任何序列点 因此,未指明首先评估的内容。

相反,在您的第二个示例中,行为是明确定义且可预测的。

答案 1 :(得分:1)

在第一种情况下,你使用一个序列对ser()进行两次调用,这些调用是从右到左进行的,所以你有96 73.

答案 2 :(得分:0)

在第一种情况下

cout << ser() << " " << ser();

相当于:

operator<<(cout.operator<<(ser()),"").operator<<(ser());

是一个完整的表达。对个体运算符的操作数和单个表达式的子表达式的评估是不确定的。因此,未定义两次调用ser()的顺序。

你唯一知道的是:

  1. 首先调用ser()在插入cout之前执行。
  2. 第二次调用ser()是在插入cout之前执行的。
  3. 未定义哪个调用ser()之前执行(它们未被排序)。
  4. 因此,实现返回96 73并且不同的实现返回73 96是有效的。

    此外,在执行期间多次计算的表达式中 对于一个程序,其子表达式的未经测序和不确定顺序的评估不需要在不同的评估中一致地执行。这允许表达式

    cout << ser() << " " << ser();
    

    在程序中运行两次,选择不同的订单。

    在第二个程序中。

    cout << ser();
    cout << ser() << endl;
    

    是两个完整的表达式(在两个单独的语句中)。在这种情况下,第一个语句在第二个语句之前排序,因为与每个值计算相关的每个值计算和副作用在每个值计算和与要评估的下一个完整表达式相关的副作用之前都会被排序。

    因此,唯一可能的结果是73 96。