0
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--;
問題是:爲什麼操作不按預期運行(即所有三個操作都在一個括號中,然後是其他所有三個操作)?
'+'的操作數是**不是**排序的。沒有什麼可以先計算出來的。 – 2013-04-25 16:18:46
@ n.m。或者甚至首先計算一個。編譯器可以計算其中的一部分,然後計算其中的一部分,然後返回第一部分等(這顯然是這裏發生的情況)。 – 2013-04-25 16:27:30