简洁既是美,程序员应尽量尝试编写简洁的表达式,争取用简单的代码来实现更多的功能,当然,这也要看情况了(有时候也得考虑程序运行的时间嘛)。

在阅读C++Prime Plus到while语句时有一个讲一个数组内容复制到另一个数组的例子:

//arr1 is an array if ints

int *source=arr1;

size_t sz=sizeof(arr1)/sizeof(*arr1); //number of elements

int *dest=new int[sz];

while(source!=arr1+sz)

*dest++=*source++;  //copy element and increment pointers

首先初始化source和dest,并使他们各自指向所关联的数组的第一个元素。while循环条件判断是否已经到达要复制的数组的末尾。如果没有,继续执行循环。循环体只有单个语句,实现元素的复制,并对两个指针做自增操作,使他们指向对应数组的下一个元素。
此处,循环体中的语句:

*dest++=*source++;

即所说的简约。这个表达式也等价于:

{

*dest=*source;

++dest;

++source;

}
根据上述,我在编译器上编写了下面的程序:

#include<iostream>

using namespace std;

int main(){

char arr1[]="string";

char* source=arr1;

size_t sz=sizeof(arr1)/sizeof(*arr1);

char *dest=new char[sz];

while(source!=arr1+sz)

*dest++=*source++;

cout<<arr1<<endl;

cout<<dest<<endl;

cout<<"**********"<<endl;

cout<<sz<<endl;

delete []dest;

return 0;

}
程序的作用为将数组arr1复制到dest中,并输出arr1和dest。但运行的结果并不是我想的:
问题

首先,我想到的是是不是数组arr1中的内容并没有复制到dest中,所以我对程序进行了但步跟踪,最后找到了原因:

开始,我们定义了一个arr1数组,接着使用new表达式动态创建了一个数组,并返回了指向新创建对象的指针dest,接着利用source指针和
dest指针复制了元素,这看起来并没有错。但是我忽略了一点,dest是一个指向动态数组的指针而不是数组名,可是我在最后的输出时把dest指针当做
了数组名(cout<<dest<<endl;)。
让我们来看看C++ Prime Plus上是怎么描述new表达式的:new表达式动态创建对象时,只需指定其数据类型,而不必为该对象命名,取而代之的是,new表达式返回指向新创建对象的指针,我们通过该指针来访问此对象。
虽然我最后输出时的确是使用dest指针来访问我们创建的动态数组,但需要知道的是此时的dest指针指的已经不是动态数组了。
如图,在程序执行while循环之前,source和dest指针分别指向arr1和动态数组的第一个元素,但执行了while循环后两个指针如图所示,所以此时再利用dest指针来访问动态数组是不行了。

解决方法:就像书上说的,对于new表达式动态创建的对象,我们通过返回的指针来访问此对象,而在本例中dest指针充当了工作指针,从而使得dest指针最后并没有指向动态数组,这样给我们访问动态数组不方便,所以我们可以再创建一个指针来代替dest指针充当工作指针。
程序更给如下:

//…

char *dest=new char[sz];

char *dest_p=dest;

while(source!=arr1+sz)

*dest_p++=*source++;

//….
程序运行结果如下:

总结:

1、简洁既是美,作为一个程序员应尽量做到自己编写的程序短小精悍,以比较少的代码使用更大的功能,有经验的程序员非常重视简练。要不断研究类似*dest++=*source++;的代码,最后达到一目了然的地步。

2C++中,在使用new表达式创建动态对象时,我们会利用返回的指针来访问此对象,所以应该创建一个新的指针来充当工作指针,避免原指针最后知道我们不清楚的地方而对访问此对象造成麻烦。

简洁既是美—用while语句复制数组的更多相关文章

  1. linq---我为你提笔序,你的美不只查询语句

    LinQ百度百科对她这样解释,是一组用于c#和Visual Basic语言的扩展.它允许编写C#或者Visual Basic代码以查询数据库相同的方式操作内存数据. LINQ是Language Int ...

  2. 【简洁之美】裴波那切数列生成器 python

    裴波那切数列可以用生成器较好的去生成,直接上代码: # 1 控制最大数字版本 def fib(max): x,y = 0,1 while y < max: yield x x,y = y,x+y ...

  3. 简洁之美 -约瑟夫环的python 解法

    问题描述: 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人出列:他的下一个人又从1开始报数,数到k的那个人又出列:依此规律重复下 ...

  4. WPF:简洁为美

    (1)3行代码实现水印TextBox(Watermark  TextBox) 效果图: 源代码: <Grid> <Grid.Resources> <BooleanToVi ...

  5. 7.21.02 switch语句

    switch语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支. 语法 switch语法格式如下: switch(expression) { case value : //语句 break ...

  6. Java循环语句怎么用?经典排序算法见真知

    Java中循环语句的使用,莫过于在排序算法中使用得最为经典. 排序算法非常的多,不过大体可以分为两种: 一种是比较排序,主要有:冒泡排序,选择排序,插入排序,归并排序,堆排序,快速排序等. 另一种是非 ...

  7. java的if语句,少于一行可以省略大括号

    我们认识的 if 语句,大概是这样的: if(条件){ 语句1; }else{ 语句2; } 如果要执行的语句少于1行,大括号是可以省略的 可以让程序更简洁和美观 if(条件){ 语句1; 语句2; ...

  8. SQL统计每科前三名的学生的语句

    偶然在论坛看到一个网友的帖子,关于他遇到一个面试题的,网站写了很多,我看了一下,结果应该是没问题的,但是为何面试官还是不满意,我想面试官可能并不是想考你真能把这道题做出来,而是看你如何简洁的通过一个s ...

  9. 感受python之美,python简单易懂的小例子

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 1 简洁之美 通过一行代码,体会Python语言简洁之美 2 Python ...

随机推荐

  1. 在Mac环境下跑汇编

    今天汇编作业做到第七章,就想在Mac下跑自己的asm程序,看到了一个很好的教程: http://www.raywenderlich.com/37181/ios-assembly-tutorial 虽然 ...

  2. Java最最基础的语法小结

    一定得记住,不然吃大亏了真的 注意不可同时运行,每次只能运行一个类型 package aad;///建根文件的时候选择了这一项就要写,没选择可以不用写 import java.io.*; import ...

  3. anjularjs 路由

    在多视图单页面web应用中,angularjs使用路由‘#+标记’来区别不同的逻辑页面并将不同的页面绑定到对应的控制器上.通过一个简单的实例来深入理解: 1.index.html 主页面中插入代码: ...

  4. GridView中的GridView1_RowCommand事件

    GridView1_RowCommand事件是GridView中生成事件时激发 比如说页面中有一个按钮给他设置CommandName属性 <asp:Button ID="btnCheH ...

  5. hdu4686 Arc of Dream ——构造矩阵+快速幂

    link: http://acm.hdu.edu.cn/showproblem.php?pid=4686 构造出来的矩阵是这样的:根据题目的ai * bi = ……,可以发现 矩阵1 * 矩阵3 = ...

  6. 当pip install不能正确安装的时候,try easy_install

    当pip install不能正确安装的时候,try easy_install 重复试了几次pip install -r requirements.txt,都在安装pillow的时候失败了,想找这个枕头 ...

  7. Objective-c——UI基础开发第十二天(相册展示)

    一.知识点 模仿新特性 UICollectionViewFlowLayout自定义布局 相册 瀑布流(淘宝购物之类的 二.复习 a.UICollectionView 和 tableview共享一套AP ...

  8. UVa 679 小球下落

    题意:这道题规律性极强,虽然是二叉树,但是可以用模拟来写. 1<<20 意思是1的二进制左移20位,即2的20次方. 对于二叉树中一个节点 k ,其左节点,右节点的编号分别是2k 和 2k ...

  9. TortoiseGit 添加ssh key

    TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.使用命令ssh-keygen -C "邮箱地址" -t rsa产生的密钥在Tortoi ...

  10. 综合使用union和limit区分结果并限制返回结果集的条数

    limit , 这里的limit限制了返回的union(合并)后的结果集,