C语言的谜题分析和总结.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
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 则不是。对于块设备,只有当下面几种情况下才会被输入,1)遇到回车,2)缓冲区满,3)flush 被调用。而 stderr 则不会。 2、下面的程序看起来是正常的,使用了一个逗号表达式来做初始化。可惜这段程序是有问题的。你知道为什么呢? #include int main() { int a = 1,2; printf(a : %d\n,a); return 0; } 参考答案:这个程序会得到编译出错(语法出错),逗号表达式是没错,可是在初始化和变 量声明时,逗号并不是逗号表达式的意义。这点要区分,要修改上面这个程序,你需要加上括号: int a = (1,2); 3、下面的程序会有什么样的输出呢? #include int main() { int i=43; printf(%d\n,printf(%d,printf(%d,i))); return 0; } 参考答案:程序会输出 4321,你知道为什么吗?要知道为什么,你需要知道 printf 的返回值是什么。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 转成二进制是:01000001010010000000000000000000,十六进制是: 0十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出 0,我们需要了解一下 float 和 double 的内存布局, 如下: float: 1 位符号位(s)、8 位指数(e),23 位尾数(m,共 32 位) double: 1 位符号位(s)、11 位指数(e),52 位尾数(m,共 64 位) 然后,我们还需要了解一下 printf 由于类型不匹配,所以,会把 float 直接转成 double, 注意,12.5 的 float 和 double 的内存二进制完全不一样。别忘了在x86 芯片下使用是的反字节序,高位字节和低位字位要反过来。所以: float 版:0(在内存中是:00 00 48 41) double 版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40) 而我们的%d 要求是一个 4 字节的 int,对于 double 的内存布局,我们可以看到前四个字节是 00,所以输出自然是 0 了。 这个示例向我们说明 printf 并不是类型安全的,这就是为什么 C++要引如 cout 的原因了。 5、下面,我们再来看一个交叉编译的事情,下面的两个文件可以编译通过吗?如果可以通过,结果是什么? file1.c int arr[80]; file2.c extern int *arr; int main() { arr[1] = 100; printf(%d\n, arr[1]); return 0; } 参考答案:该程序可以编译通过,但运行时会出错。为什么呢?原因是,在另一个文件中用 extern int *arr来外部声明一个数组并不能得到实际的期望值,因为他们的类型并不匹配。所以导致指针实际并没有指向那个数组。注意:一个指向数组的指针,并不等于一个数组。修改:extern int arr[]。(参考:ISO C 语言 节) 6、请说出下面的程序输出是多少?并解释为什么?(注意,该程序并不会输出 b is 20) #include int main() { int a=1; switch(a) { int b=20; case 1: printf(b is %d\n,b); break; default: printf(b is %d\n,b); break; } return 0; } 参考答案:该程序在编译时,可能会出现一条 warning: unreachable code at beg

文档评论(0)

tianya189 + 关注
官方认证
文档贡献者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地湖北
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档