2013-04-25 63 views
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--; 

問題是:爲什麼操作不按預期運行(即所有三個操作都在一個括號中,然後是其他所有三個操作)?

+2

'+'的操作數是**不是**排序的。沒有什麼可以先計算出來的。 – 2013-04-25 16:18:46

+1

@ n.m。或者甚至首先計算一個。編譯器可以計算其中的一部分,然後計算其中的一部分,然後返回第一部分等(這顯然是這裏發生的情況)。 – 2013-04-25 16:27:30

回答

1

操作順序在順序點之間沒有保證。序列點通常在分號處找到。

反正不會a[c-1]++;好於(c--, a[c]++, c++)嗎?爲什麼在你不保留一些其他計算值的情況下向主RAM寫入新值c

+2

逗號運算符也是一個序列點。 – 2013-04-25 16:27:59