奇怪的逗号运算符行为

时间:2013-04-25 16:12:43

标签: c++ operators

void foo() {
   int a[5], c = 2;
   for (int i = 0; i < 5; i++)
      a[i] = 0;
   int res = (c--, a[c]++, c++) + (c++, a[c]--, c--);
   for (int i = 0; i < 5; i++)
      cout << i << ": " << a[i] << endl;
}

上面的代码将打印:

0 : 0
1 : 1
2 : -1
3 : 0
4 : 0

而不是:

0 : 0
1 : 1
2 : 0
3 : -1
4 : 0

这是因为生成的代码中的操作顺序如下:

// first parentheses
c--;
a[c]++;
// second parentheses
c++;
a[c]--;
// and only then the last operation
res = c++ + c--;

问题是:为什么操作没有按预期运行(即一个括号中的所有三个操作,另一个中的所有三个操作)?

1 个答案:

答案 0 :(得分:1)

在序列点之间不保证操作顺序。序列点通常在分号处发现。

无论如何a[c-1]++;不会优于(c--, a[c]++, c++)吗?为什么在不保留其他计算值的情况下,为c写入{{1}} 4次的新值?