- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)