设为首页 加入收藏

TOP

对两个奇葩的C语言程序的思考
2014-11-23 22:10:00 来源: 作者: 【 】 浏览:12
Tags:两个 奇葩 语言程序 思考

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个章节中:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇一次Java调用OS命令的优化过程实录 下一篇编译Hadoop-2.4.0之HDFS的64位C++..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: