C 语言的谜题 –英特尔® 件网络博客 - 中文 页码,1/ 10
主页 博客
C 语言的谜题
作者:haoel (1 篇文章) 日期:九月9, 2010 在6:03 下午
这几天,本站推出了几篇关于C语言的文章如下所示:
语言的歧义[酷壳链接] [优快云链接]
谁说C语言很简单? [酷壳链接] [优快云链接]
6个变态的C语言Hello World程序 [酷壳链接] [优快云链接]
如何加密/弄乱C源代码 [酷壳链接] [优快云链接]
C语言的谜题 [酷壳链接] [优快云链接]
我们可以看到很多C语言相关的一些东西。比如《语言的歧义》主要告诉了大家C语言中你意想不到的
语言很简单》则通过一些看似你从来不可能写出的代码来告诉大家C语言并不是一件容易事情
码》则以一种极 的方式告诉大家,不要以为咱们自己写不出混乱的代码,每个程序员其实都有把代
信你对编程或是你觉得很简单的C语言有了一些了解。是的,很不容易吧,以前是不是低估了
呢?本篇文章《C语言的谜题》展示了14个C语言的迷题以及答案,代码应该是足够清楚的,
作可能会见得到的。通过这些迷题,希望你能更了解C语言。如果你不看答案,不知道是
1、下面的程序并不见得会输出hello-std-out,你知道为什么吗?
#include
#include
int main()
{
while(1)
{
fprintf(stdout,"hello-std-out");
fprintf(stderr,"hello-std-err");
sleep(1);
}
return 0;
}
参考答案:stdout和stderr是不是同设备描述符。stdout是块设备,stderr则不是。对于块设备,
车,2 )缓冲区满,3 )flush被调用。而stderr则不会。
2 、下面的程序看起来是正常的,使用了一个逗号表达式来做初始化。可惜这段程序是有问题
#include
int main()
{
int a = 1,2;
printf("a : %d\n",a);
return 0;
}
http :///zh-cn/blogs/2010/09/09/c-5/?cid=sw:prccsdn1307 2010-10-15
C 语言的谜题 –英特尔® 件网络博客 - 中文 页码,2/ 10
参考答案:这个程序会得到编译出错 (语法出错),逗号表达式是没错,可是在初始化和变量
区分,要修改上面这个程序,你需要加上括号:int a = (1,2);
3、下面的程序会有什么样的输出呢?
#include
int main()
{
int i=43;
printf("%d\n",printf("%d",printf("%d",i)));
return 0;
}
参考答案:程序会输出4321 ,你知道为什么吗?要知道为什么,你需要知道printf 的返回值是什
4 、下面的程序会输出什么?
#include
int main()
{
float a = 12.5;
printf("%d\n", a);
printf("%d\n", (int)a);
printf("%d\n", *(int *)&a);
return 0;
}
参考答案:该项程序输出如下所示,0 12 1095237632 原因是:浮点数是4个字节,12.5f 转成二
十六进制是:0十进制是:1095237632。所以,第二和第三个输出相信大家也知道是
们需要了解一下float和double 的内存布局,如下:
float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)
然后,我们还需要了解一下printf 由于类型不匹配,所以,会把float直接转成double,注意,12.5
了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:
float版:0(在内存中是:00 00 48 41)
double版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40