我工作的一個C的輸出問題:期待SIGSEGV,但得到正常工作
#include<stdio.h>
int main()
{
int a[][2][3]={0,1,2,3,4,5,6,7,8,9,10,11,12};
int i=-1;
int d;
d=a[i++][++i][++i];
printf("%d\n",d);
return 0;
}
鏈接Ideone:http://ideone.com/1oS9Un
,並期待一個運行時錯誤,但令人驚訝的代碼上工作正常CodeBlocks,Dev C++和Ideone。根據我的說法,每個存儲器地址在運行時由以下等式通過編譯器解析:a [i] [j] [k] = ((*(a + i)+ j)+ k)每個編譯器應首先解析內部括號,然後解析下一個內部括號等。
因此在給定行
d=a[i++][++i][++i];
應被解析爲:
d=*(*(*(a+i++)+ ++i)+ ++i)
也通過,http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm (請參閱注2)
最內的括號應首先解決,它的值應該是a-1,而我變成0.因此,我們應該得到一個SIGSEGV錯誤,因爲我們試圖訪問內存而不是特定的由編譯器標記的盟友仍在所有三個編譯器中顯示輸出。請解釋一下。
未定義......... – devnull