The C++ Programming Language 学习笔记 第6章 表达式和语句

    1、关于strcpy函数

          书中说c风格的字符串尽量少用,strcpy这样的函数应该也要少用。这里讲这个函数主要是要通过本章课后练习第十题来讲一下前面提及的要点。巩固一下前几章的知识。写了一段,本来感觉自己写得不错了,结果和网上的一笔感觉还是差很多,也学到了很多,下面贴上网址供大家看看。http://blog.csdn.net/cazicaquw/article/details/7044602

      里面讲得很详细,很多细节对于我们初学者来说也是很有用的。但感觉他写得太繁琐了,其实从指针到bool的隐式转换是比较安全的,完全没必要多写。网上也有很多不同版本的strcpy函数,感觉效率和安全不能兼得,还是要看具体实现的情况来写这个函数。

    2、关于Duff 设施

         书中本章第15道练习题有一道很神奇的题目。代码如下

        

 1 void send(int* to, int* from, int count)
 2   // Duff’s device. Helpful comment deliberately deleted.
 3 {
 4   int n = (count+7)/8;
 5   switch(count%8) {
 6   case 0: do{ *to++ = *from++;
 7   case 7:     *to++ = *from++;
 8   case 6:     *to++ = *from++;
 9   case 5:     *to++ = *from++;
10   case 4:     *to++ = *from++;
11   case 3:     *to++ = *from++;
12   case 2:     *to++ = *from++;
13   case 1:     *to++ = *from++;
14     }while(--n>0);
15   }
16 }

           看了之后简直有一种啊啊啊,我又买到盗版书了,为什么书上题目又印错了,可是书明明很贵啊为什么还是盗版的蛋疼感。但最后还是把代码打进机器里运行了一下,竟然能跑,竟然还有意义,真是厉害。

          这段代码的意义是把from数组的前count个数复制给int数组。我们再来解析一下这段代码,代码把8个数分成一个小组进行复制,count%8求的是第一次需要复制几个数,而求n则是求一个要进行几组复制(除了第一组外,其他都是8个8个数一组进行复制的)。那么这段代码是如何实现的呢。我们可以先不看switch语句,因为在C中,switch语句的case可以插在任何一句代码之前,达到跳转的目的,类似于毒瘤goto啊。过滤掉switch的相关语句之后,就很明了了的看出了分组复制,再把switch加进去,可见switch是来选择第一次复制时该从哪一句开始,因为从第二组开始,do-while循环就会自己跳转,switch相关语句起不到任何作用了。

         下面来分析一下效率,相比于普通的循环,好处在于不用每次复制都比较一次跳出条件,而是每8次复制才判断一次,减少了大量的复杂度。

1 void my_send(int *to, int *from, int count)
2 {
3     for (int i = 0; i != count; ++i) {
4         *to++ = *from++;
5     }
6 }

           然后是我发现的程序的一个小bug,如果输入的count=0的话,还是会复制8个。不过考虑到这算是底层的代码,没有相关的考虑也算正常。如果有不同看法的,欢迎留言讨论。

           下面是我网上查阅的资料。

            维基百科——达夫设备

           达夫设施——nicky_zs的博客

          

posted @ 2015-04-16 21:13  一个大叔  阅读(145)  评论(0编辑  收藏  举报