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. nyoj_5:Binary String Matching

    简单字符串匹配 题目链接 #include<iostream> #include<cstring> using namespace std; int fun(char*aa,c ...

  2. 【.net 深呼吸】在运行阶段修改应用配置文件

    上一篇博文中,老周所介绍的自行编写的配置类,虽然能够很好地做封装,但它仅允许修改用户级别的配置,所以文件都是保存到用户配置目录下的.可是,许多情况下,我们还是不考虑用户隔离,而是能够直接修改与应用程序 ...

  3. Mybatis Dynamic Query 框架整合

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  4. 基于三台主机部署phpwind

    PHPWind(简称:PW)的使命是让网站更具价值,让更多人从网络中享受便利,以提升生活品质. phpwind是一个基于PHP和MySQL的开源社区程序,是国内最受欢迎的通用型论坛程序之一.phpwi ...

  5. Hibernate的系统 学习

    Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...

  6. AndroidTv开发中常用的adb命令

    盒子应用开发时,调试比手机上的开发比较麻烦一点,而且需要经常跟 adb 打交道,不管是 wifi 连接调试,还是应用删除安装等.这里记录一些常用的操作,方便查阅. adb wifi连接调试 方法一:需 ...

  7. ABAP中Collect的用法

    vaule:collect在非数值字段相同的情况下,起到了数值字段汇总作用. 非数值字段不同的情况下,效果和append相同执行插入内表操作,当非数值字段相同的时候,则相当于modify的效果,只不过 ...

  8. KMS注册

    --KMS注册 -------------2014/03/25 --Read this First http://social.technet.microsoft.com/wiki/contents/ ...

  9. OS作业模拟SJF和FCFS

    一个OS的作业, 用于模拟短作业优先 和 先来先服务两种作业调度方式. #!/usr/bin/python3.5 ## Modify the SJF and FCFS algorithm in the ...

  10. re模块和正则表达式

    re模块 讲正题之前我们先来看一个例子:https://reg.jd.com/reg/person?ReturnUrl=https%3A//www.jd.com/ 这是京东的注册页面,打开页面我们就看 ...