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. public/private/protected的具体区别

    在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友 ...

  2. filezilla里怎么解决中文乱码问题

    使用Filezilla client FTP客户端登陆某些FTP站点会出现中文乱码,原因是FTP服务器端编码与filezilla client端编码不一致造成的.解决方法如下:文件-站点管理-选中要登 ...

  3. 设计模式(3)抽象工厂模式(Abstract Factory)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 设计模式(2)工厂方法模式(Factory Method) 源码地址 0 抽象工厂模式简介 0.0 抽象工厂模式定义 抽象工厂 ...

  4. vue2中component父子组件传递数据props的使用

    子组件使用父亲传过来的数据,我们需要通过子组件的 props 选项. 组件实例的作用域是孤立的,不能在子组件的模板内直接引用父组件的数据.修改父亲传过来的props数据的时候 父亲必须传递对象,否则不 ...

  5. 【javascript】继承

    1. js 其实是一个非面向对象的语言,通过对象的深浅复制完成继承 2. 继承方法 继承的方法有两种 1)prototype 原型模式 举个例子 var Animal = function () { ...

  6. Verilog HDL程序设计——基本要素

    Verilog基本上熟悉了,继续整理一下Verilog的学习笔记吧.前面记载了Verilog的结构,写Verilog的结构有了,但是该怎么写呢?在写之前就得了解一下Verilog的一些基本要素了,也就 ...

  7. 红帽 Red Hat Linux相关产品iso镜像下载【百度云】(转载)

    不为什么,就为了方便搜索,特把红帽EL 5.EL6.EL7 的各版本整理一下,共享出来.正式发布 6.9 :RedHat Enterprise Server 6.9 for x86_64:rhel-s ...

  8. 记Angular与Django REST框架的一次合作(2):前端组件化——Angular

    注:这是这个系列的第二部分,主要集中在Angular的使用方面.之前使用过AngularJS(Angular 1.x),混在Django的模板中使用,这些页面一般完全是结果展示页.在有Django表单 ...

  9. 自制刻度尺-前端简易实现"腾讯信用"界面

    依据我现有的知识,在前端上"简易"的实现了腾讯信用的界面,同时自己自制了一个竖直的刻度尺插件,曲线的位置可以根据传入的数值动态的改变,这次主要也想总结一下关于jQuery中exte ...

  10. 605. Can Place Flowers种花问题【leetcode】

    Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...