我正在研究一个 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 错误,因为我们试图访问没有被编译器特别标记的内存,仍然显示输出三个编译器。请解释一下。