私はC出力の質問に取り組んでいました:
#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 で i が 0 になる必要があります。したがって、コンパイラによって特にマークされていないメモリにアクセスしようとすると、SIGSEGV エラーが発生するはずですが、それでもすべてに出力が表示されます。 3 つのコンパイラ。これを説明してください。