1、关于strcpy函数

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

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

2、关于Duff 设施

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

 void send(int* to, int* from, int count)
// Duff’s device. Helpful comment deliberately deleted.
{
int n = (count+)/;
switch(count%) {
case : do{ *to++ = *from++;
case : *to++ = *from++;
case : *to++ = *from++;
case : *to++ = *from++;
case : *to++ = *from++;
case : *to++ = *from++;
case : *to++ = *from++;
case : *to++ = *from++;
}while(--n>);
}
}

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

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

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

 void my_send(int *to, int *from, int count)
{
for (int i = ; i != count; ++i) {
*to++ = *from++;
}
}

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

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

维基百科——达夫设备

达夫设施——nicky_zs的博客

The C++ Programming Language 学习笔记 第6章 表达式和语句的更多相关文章

  1. The C++ Programming Language 学习笔记 第7章 函数

    1.关于内联函数(inline)      借用一下书中的例子. inline int fac(int n) { ) ? :n*fac(n-); }      inline描述符给编译器一个提示,要求 ...

  2. The C++ Programming Language 学习笔记 第5章 指针、数组和结构

    1.关于输出指向字符的指针的值. 现在定义,char c='a',char* pc=&c.在C中,输出该值只需要printf("%p\n",pc);而在C++中,如果cou ...

  3. The C++ Programming Language 学习笔记 第四章 类型和声明

    1.关于main 函数中的 return 0 C99标准中,main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统).如果 main 函数的最后没有写 return ...

  4. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  5. dot language 学习笔记

    dot language 学习笔记 UP | HOME   dot language 学习笔记 Table of Contents 1 dot 语言简介 2 基本语法 2.1 常用图形 2.2 常用线 ...

  6. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第九章:贴图

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第九章:贴图 代码工程地址: https://github.com/j ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二章:矩阵代数 学习目标: 理解矩阵和与它相关的运算: 理解矩阵的乘 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第一章:向量代数 学习目标: 学习如何使用几何学和数字描述 Vecto ...

  9. Stealth视频教程学习笔记(第二章)

    Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

随机推荐

  1. C指针1

    //定义:指针是一个特殊的数据类型,指针指向内存中的地址,因此,指针变量存储的是内存中的一个地址 //例子,%p表示打印一个地址,打印p表示打印p指向的地址 //输出结果为0x7fff5fbff7dc ...

  2. canvas学习总结六:绘制矩形

    在第三章中(canvas学习总结三:绘制路径-线段)我们提高Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRec ...

  3. Vue项目搭建完整剖析全过程

    Vue项目搭建完整剖析全过程 项目源码地址:https://github.com/ballyalex 有帮助的话就加个星星呗~!  项目技术栈:vue+webpack+bower+sass+axios ...

  4. 这是个巧妙的表达式: a ˆ= b ˆ= a ˆ= b 它不需要临时变量就可 以交换 a 和 b 的值。

    这不具有可移植性.它试图在序列点之间两次修改变量 a, 而这是无定义的. 例如,有人报告如下代码: int a = 123, b = 7654; a ^= b ^= a ^= b; 在 SCO 优化 ...

  5. Android Gesture 手势创建以及使用示例

    在Android1.6的模拟器里面预装了一个叫Gestures Builder的程序,这个程序就是让你创建自己的手势的(Gestures Builder的源代码在sdk问samples里面有,有兴趣可 ...

  6. 媒体查询Media Queries详解

    @media 标签可以说是响应式网页的开发基础.其主要由媒体类型(Media Type)和 媒体特性(Media Query)两部分组成. Media Type 设定后面规则生效的展示类型,包括all ...

  7. python基础===使用switch方法,减少使用if语句

    def jia(x,y): return x+y def jian(x,y): return x-y def cheng(x,y): return x*y def chu(x,y): return x ...

  8. PC网页版、移动客户端、Wap版 有什么不同

    测试周期中,可能会涉及到版本说明的词汇,比如:PC版.网页版.Web客户端.PC客户端.移动端.移动客户端.Wap版.H5. 关于"PC网页版"- 因为之前,基本没有PC终端业务,所以我们在通常的沟通 ...

  9. insertBefore 和 insetAfter函数详解

    在Javascript DOM编程艺术上面讲到,insertBefore(   )函数,即在已有元素前面插入一个新元素: 语法: parentElement . insertBefore(newEle ...

  10. 社交系统ThinkSNS+ APP更新至V0.8.3---新增打赏、用户认证

    一.ThinkSNS简介 目前社交系统ThinkSNS(简称TS)有两个版本并行: ThinkSNS V4----最新版本ThinkSNS V4.6.1,第一次发布时间为2015年7月15日,最近更新 ...