1. 第一个程序如下:
#include
#include
void main(int i) {
printf("%d\n", i);
(&main + (&exit - &main)*(i/1000))(i+1);
}
这里面涉及到对函数指针,递归,C程序规范的考察以及C语言运行时环境的考察。如果main函数使用void main(int i)的格式声明的,默认参数i为1. 这样进入main之后,当i的值大于0且小于1000时,i/1000为0.所以(&main+(&exit-&main)*0)依然等于main,这样就相当于开始递归调用main函数,且i的值每次增1.当i的值增长到1000时,&main+(&exit-&main)*1就是函数exit. 所以函数将退出,并且返回值为1001. 由于status为unsigned char类型,所以实际的值为1001%256=233.运行结果如下:
第二个程序为:
linuxidc@ubuntu:Practice$ cat main2.c
#include
void main() {
int a[]={1,2,3,4,5,6};
printf("a[5]=%-5d 5[a]=%-5d\n",a[5],5[a]);
}
linuxidc@ubuntu:Practice$ gcc main2.c -o main2
linuxidc@ubuntu:Practice$ ./main2
a[5]=6 5[a]=6
linuxidc@ubuntu:Practice$
我记得这个好像曾经是MIT的C语言考试题目,考察对C语言数组实质的理解。即a[5]将转换为*(a+5),所以和5[a]的*(5+a)的值相同。
将C语言梳理一下,分布在以下10个章节中: