没有合适的资源?快使用搜索试试~ 我知道了~
解答C puzzles 2009/11/26: 对42-45进行了解答 2009/09/16: 对第25题补充了参考材料 完成35~41的回答 2009/09/xx: 修改过n次了:-P 1. sizeof的运算结果大多数情况下是无符号整形(具体与
资源推荐
资源详情
资源评论
解答C puzzles
2009/11/26:
对42-45进行了解答
2009/09/16:
对第25题补充了参考材料
完成35~41的回答
2009/09/xx:
修改过n次了:-P
1. sizeof的运算结果大多数情况下是无符号整形(具体与编译器有关),无符整形与有符号整型运算时,
要将有符号整形提升为无符号数。所以-1会成为非常大的整数,因而使得for循环没有执行。为了避免这种
问题,可以将TOTAL_ELEMENTS宏修改成如下:
#define TOTAL_ELEMENTS (int)(sizeof(array) / sizeof(array[0]))
或者使用更为彻底一些的办法:
#define sizeof (int)sizeof
2. 减号(-)不能作为函数名;
3. 不管continue是在while、for或do循环中,意思都是忽略剩余代码,重新进行循环条条判定(想一想,
如果continue连循环条件判定都可以省略掉,那岂不成了无限循环)。所以程序的输出是:1
4. 先是很多重复的hello-err,之后是重复出现的hello-out,然后按以上方式轮流重复出现。
原因:标准输出流stdout默认是行缓冲的,也就是说只有遇到换行符或缓冲区满才真正将数据输出;而标准
输错流stderr默认是无缓冲的,一旦向流中输出马上显示。题目中给出的程序虽然向stdout输出,但由于没
有换行符,缓冲区也没有满,所以反倒是输出到stderr的的内容先显示出来,一直到标准输出流缓冲区满之
后,全部缓冲内容一次输出。
如果只是为了按代码次序在屏幕上输出内容,可以使用如下两种方法:
在向stdout输出前使用如下语句将将其设置为无缓冲
setvbuf(stdout, NULL, _IONBF, 0);
每次向stdout输出都跟着换行符
fprintf(stdout,"hello-out");
5. 宏展开时,如果遇到#或##,则对紧相连的的形参按实参字面值进行替换。是#时,作为字符串替换,是
##时,作为记号替换。
展开h(f(1,2))时,由于h的定义体中没有#或##,所以对f(1,2)进行展开,得到g(12),再展开得到"12";
展开g(f(1,2))时,由于g的定义体中包含了#,所以只对形参按实参字面值进行替换,得到"f(1,2)"。
6. 看清楚了,代码中的那个“defa1ut”有拼写错误(字母l和u位置应对调), 这样就相当于是定义了一
个标号,而不是流程控制了。而且这种拼写错误极难发现,甚至在一些带语法高亮的编辑器那里,标号也是
高亮显示的(如vim),真是防不胜防啊!除了更加仔细和重新设置编辑器的语法高亮外,其实还是有办法
的。
编译时使用-Wall打开所有警告,会看到“标号xxx定义但未使用”的信息;
据说使用lint也可以,我安装了linux平台下的splint,但是即使用最严格的-strict参数,也未能检测出该
问题,谁知道怎么回事?
7. 这个我不懂。
8. 函数的功能是计算输入参数的二进制模式中1的个数。算法的基本原理是:将所有二进制模式中的数字加
起来就是要求的结果,只是算法使用了一种更高明更高效的方式(只用5次就可能计算完成),具体说来:
第一次,将二进制数中的相临两位上的数字相加,然后将相加结果(两位)再赋值到原来的位置。例如,拿
最低两位是11的情况来说明,这两位上的数据相加结果为10(十进制的2,表示位模式中有2个1),再通过
赋值,得到的结果最低两位是10。
第二次,将上面得到的结果继续处理,这次将相临4位数字按2个两位数相加(这个两位数就是上面分组计算
得到的),4位的结果还是赋值到原来的位置;
按上述方法不计算剩余三次,最终得到结果。
9. 问题的根源在于,计算机中的数字都是用二进制表示的,而小数不能用二进制精确表示(十进制小数化
为二进制的方法是乘2取整法,大家照此方法拿0.1试试,看能否精确表示),所以最终的结果也是不精确
的。
至于我们经常讨论的浮点数比较问题,其根本原因也在于此。
10. 根据C语法
int a = 1,2;
是定义一个名为a的int变量,并初始化为1,定义名为2的int变量,没有初始值。数字2不能作为变量名,所
以这是一个语法错误。
如果将代码改为
int a = (1,2);
则意思变为,定义一个名为a的int变量,并初始化为表达式(1,2)的结果,所以a的初始值为2。
11. 这绝对是一个有效的程序,运行结果为
4321
只要知道printf的返回值是输出字符个数就明白为什么了!
12. Duff's device(达夫设备),通过减少比较次数和扩大循环体来优化循环的技巧。函数的功能是从
from复制count个字节到to。使用她的理由就是:速度。
不过我认为这里面有一个bug,即当count为0时,还是会复制8个字节到to。
下面是我的修正代码:
void duff(register char *to, register char *from, register int count)
{
register int n=count/8;
switch(count%8){
资源评论
Zhao70
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功