c语言的迷题 pdf,计算机C语言的谜题.pdf

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值