求c/c++编程心得,就是自己感觉比较好的地方和技巧

作者&投稿:徒支 (若有异议请与网页底部的电邮联系)
C++与C有什么区别于联系?~

主要区别:C语句是面向结构的语言,C++是面向对象的语言,C++从根本上已经发生质飞跃,并对C进行丰富的扩展。
C与C++的区别 C是一个结构化语言,如谭老爷子所说:它的重点在于算法和数据结构。
C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
对语言本身而言,C是C++的子集,那么是什么样的一个子集?从上文可以看出, C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。

C与C++的区别:
1. C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是 如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程 (事务)控制)。
2. 对于C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应 的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控 制。
  所以C与C++的最大区别在于它们的用于解决问题的思想方法不一样。之所以说C++比C更先进,是因为“ 设计这个概念已经被融入到C++之中 ”,而就语言本身而言,在C中更多的是算法的概念。那么是不是C就不重要了,错!算法是程序设计的基础,好的设计如果没有好的算法,一样不行。而且,“C加上好的设计”也能写出非常好的东西。
对语言本身而言,C是C++的子集,那么是什么样的一个子集?从上文可以看出, C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等等。

  C++在历史上曾经是C的扩展,不过现在两个都各自有发展,所以现在的C++与现在的C没有谁是谁的扩展的关系。
现在有人说C和C++是大熊猫和小熊猫的关系,也就是说只是名字相近——这多少有欠公允。不过C和C++的确是有巨大区别的,C语言简单有效,但处理大问题就很麻烦像把左轮手枪;而C++则简直是一辆坦克,功能齐备,但更肥大——无非都是兵器而已。至于说学习上C是C++的基础,倒是一大误区,枪械和火炮长得可能有点像,甚至也有点渊源,但终究全不是一回事。

先学C,后学C++有好处也有坏处,应该说至今仍有争论。
我的看法是,如果是做应用软件一类的编程,就不应该先学C,而且应该在初学时少接触C的旧式编程风格,而是把大部分精力放在C++的标准库(包括基于STL的编程,这方面国内一般的教材最欠缺),以及基于对象和面向对象的编程上。这是因为C++的这些应用从编程方式到代码风格都与C语言大相径庭,初学养成C式的编程习惯就很改掉,反而限制对类和泛型编程的理解。
如果是想接触比较底层的东西,以后做软件库开发、系统编程之类,那么学C语言,尤其是一些像宏、指针、内存管理等知识就很有好处(这些东西在前一种应用中却都要尽量避免)。但先学C的好处并不明显,因为直接学C++同样可以学到这些东西,只要改变一点学习侧重就可以了。
上面是从应用方向角度说的。至于学习的困难程度,直接学C++并不难,而且在一些方面更简单一些;只不过C++的内容比C多罢了。C++的创始人Stroustrup就大力提倡不要学C,并列举了先学C的种种坏处。因此我的意见也是不学C,直接学C++。

现在国内讲C++的书一般是先讲与C相似的一块,后讲C++独有的内容,没有融合在一起,看似C成了“基础”。其实这种讲法主要是由于国内编教材的教师多是学C语言(甚至机器码、汇编)出身的,可能到很晚才接触C++,因而有思维定势。其实看国外许多教材,一入门就强调类的概念,入门不多久就大量用到STL,过程式的语法与这些一块讲,同样也很直观(对象的概念实际上比函数的概念直观得多),可以学得通。

编程,就是把复杂的问题简单化,简化到每个动作都是1+1=2那么简单,然后计算机照做就好了。这就是我理解编程的真谛。我师姐听到了,也若有所悟,这个话题就没有再说了。

我们来分析一下计算机的特点,准确的讲,目前我们这个社会的计算技术,还很原始,说它是计算机,正确,它确实只能计算,说它是电脑,太抬举它了,它不可能有思考能力。

在冯诺依曼体系架构中,计算设备就是具有一定计算能力,有能力和外界做出IO互动,并且能高速重复动作的这么一种设备,这可能和大家在教科书里面学到的不太一样啊,不过,我是这么理解的。

因此,我从一开始,就没有把计算机作为一个伙伴,一个可以帮助我出主意,或者代替我思考的伙伴,仅仅是看做一种工具,这种工具有什么用呢?我认为它最重要的,有两个作用:

1、无限可重复性,一个动作序列,一旦编订程序,计算机就可以无数次重复这个序列,不会感到累。这特别适合于那些乏味的,不断重复的劳动,比如,我们一个学校每天要敲钟,打上课铃,如果让人来做,这个人会很乏味,做久了,就可能出错,但是让计算机来做,它可没有什么思想,不会觉得累,而且做的很好。计算机特别适合做重复性工作。

2、服务品质的稳定性。计算机适合做重复工作,还有个有点,就是每次执行结果都是一样的。这体现了工业化时代最重要的一个思想:量产思维,大家可以看到,现在的社会,不可重复的艺术固然很好,但公众需要的是量产的产品,因为质量稳定,产量稳定,能满足大众需求。劳斯莱斯虽然很美,但绝大多数人在开大众、丰田等低端车。就是这个道理。还是打铃那个例子,如果是人,可能会生病,可能会请假,或者干脆搞忘了,但计算机不会,只要有电在正确工作,打铃就不会出错。

这样,我就慢慢理解到了,计算机其实就是能以恒定品质不断重复输出服务的机器而已。

ok了,这我们是不是可以理解到,计算机编程,其实首先是人的工作,当我们遇到一个服务需求,我们人来做一次,嗯,获得一个比较满意的结果,然后我们觉得这个动作可以重复,下次遇到类似的问题,照做就好了。于是,我们就安排计算机来做这件事了。是不是这样?

这是不是说明,程序,其实是在讲一件事应该怎么做,这个做的过程,以及这个过程的含义,其实是人定义出来的,然后通过编程,教给计算机来做而已。

我以前经常有种感觉,计算机编程,是两层意思,一层,是程序本身的含义,就是怎么做事,另一层,是隐含在程序下面的逻辑含义,就是做事的意义,程序只是字面上的意思,而逻辑,是程序段落组合起来,共同表述的一层意思。现在想想,其实就是这个道理。

嗯,既然我们知道,编程,就是把做一件事情的步骤,分拆开来,教计算机去做,但,分拆到什么粒度呢?这个很重要。如果分拆的粒度太细,白白浪费程序员的时间和精力,这些都是成本。而分拆得太粗,计算机还是弄不明白,做事不对,就是bug了。

这说明,编程有个很重要的概念,就是粒度,也就是我们对问题描述的精细程度。

最开始的计算机是最笨的,学过计算机组成原理的同学大概知道,只要有个累加器,其实已经可以算一台计算机了,只会做加法计算。因为从数学上,我们可以知道,任何计算,最终都可以演化成加法计算,事实上,现在的CPU,在最底层核心的部分,也还是这个加法逻辑。

这样做当然没什么不好,不过,有个小小的问题,就是粒度太细了。如果每件事情,都要程序员去拆解成很细的加法计算,这个工作就几乎不是人干的事情了。难道就无解了吗?

呵呵,前面我们说过,计算机的特点是什么?无限重复,大家就发现,一个事情,比如7*24,这是乘法计算,但是,我们最终要拆解为加法计算去实现,但是,不是说我们每次都要这么拆解,乘法计算也是一个工作,有规律的,因此,当我们拆解一次之后,我们当然可以把这次拆解过程本身,编订为程序,下次遇到类似问题,让计算机把这个程序再跑一遍就ok了。呵呵,大家以为Intel的CPU里面的乘法计算指令是怎么实现的?大家又以为AMD的CPU内部的微代码体系是怎么实现的?

就是这么一个思维,解决了所有的问题,遇到需求,首先拆分,然后不断检索我们以前是不是以前拆分过了,遇到能套用的程序段落,就直接用,不用每次都拆分那么细,减少工作量,当然,遇到新问题,还是需要自己拆解的,不过,拆解后,最好把拆解本身,也写成程序,下次重用。

大家玩各种语言,一般都提供基本库,这个基本库,其实就是前人已经拆解过的结果,软件公司觉得有代表性,可以满足大多数应用场合,就编订到基本库里面,以后程序员直接用,不用自己重复了,大家说是不是这样?

现在,大家知道怎么看待C的stdio.h,stdlib.h这些基本库了吧?C++的iostream是什么含义,知道了不?MFC知道了不?Java的运行时库是什么意思,也知道了吧?

不过呢,这个世界的需求总是很多的,并且,计算机的能力也是不断在进步,以前不适合计算机做的事情,现在也慢慢变得适合了。因此,大家总能遇到一些新问题,需要自己重新拆解,基本库中没有提供,这就是程序员这个职业存在的真实含义。帮助用户不断拆解新需求,解决新问题。当然,库本身也在进步,不断把已经被证明拆解成功的问题,修补到库中,避免以后的程序员做重复工作。就这么简单。

呵呵,啰嗦了这么多,可能很多同学看的一头雾水,肖舸老师你到底想说啥?

我想说的,其实很简单,编程序,就是拆解问题,但讲究个拆解的技巧和方法,以前人做过的,别做,尽量用,没有的,做过一次,尽量保留下来,供下次使用,就这么简单。

那,这和本文的题目“修炼编程的内功”有啥关系呢?

当然有关系了,什么叫编程的内功?我的理解,就是对这个世界的抽象化理解能力以及描述能力。一个工作,能迅速从中提炼出下次可以重复的套路,并且能以一定的规则,就是计算机语言规范,描述出来,拥有这两个能力,就能保证遇到任何问题,都有办法写出程序来。

所以,大家学校中学了很多数学,语言,算法,数据结构,甚至编译原理,操作系统,其实这些统统是工具,不是写程序的目的。

写程序,就是遇到需求,能迅速抽象,理解其共性,并能以清晰的语言描述出来。上述学科,不是帮助提升你的抽象能力,就是帮助提升你的描述能力,大家看是不是这个道理?

所以,我在带徒弟的时候,有时候喜欢说一句话,其实作为程序员,学习一点语文有好处,因为最能培养描述能力的,其实还是语文。英语不算啊,英语虽然也是一门语言,但中国的教育,一般是能看懂,很少从一个英文文学家的角度培养学生用英文的描述能力。只有我们的语文课,这不但是教语言,而且通过无数次造句和作文,在教大家描述问题的组织能力,这个能力在写程序的时候,很有用。

这个时候,话题就出来了。中国的语文,先是甲骨文,然后古文,然后白话文,大家发现没有,总体是越来越简单,这是发展的趋势。为什么呢?因为大家觉得,语文就是让人懂的,太深奥的东东,不太适合普及,就没有生命力,反而越简单的东东,普及越快。

因此,请大家注意,写程序时拆解,是把问题简单化,不是说把一个问题描述得晦涩难懂,才叫本事。真正的程序高手,都是简化问题的大师。

当然,从这个话题,我们是不是可以得出一个结论,其实写程序的方法本身,编程的内功本身,其实是没有什么语言特性的,C、C++、Java、PHP、Python。。。是不是都用的同一种方法在做事情?

因此,我这里提出,修炼编程的内功,是学习抽象能力和描述能力,与语言无关,换而言之,从任何一门语言入门,都可以修炼到内功的极致,关键看你用不用心。

因此,学习期间,我的建议,不要好高骛远,不要去评价语言的好坏,平台的好坏,没有多大意义的,你并不能确定这辈子最终能在哪个平台下用哪种语言开发。捡着手边有的书,老师教的课程,埋进去学扎实,出来后,换语言比吃盘菜也难不倒哪去,呵呵。这算是正式回答杰杰同学的问题。

再说一下郭晓同学的问题。他列了一个很偏的题目,就是有两个变量a和b,不用if、?:、switch或其他判断语句,找出两个数中比较大的那个。

这个问题,我不认为是个好问题,因此提出异议。主要的原因就是基于上述的讨论,我认为评价一个程序员好坏的标准,应该是考察其简化描述问题的能力,而不是把问题复杂化的本事。

这在学院派里面很多,这里大家可不要生气啊,我知道大家现在基本上都是大学学计算机专业的,算是学院派,但肖老师我的实战出来的,看法很多都和大家不一样。

学校里面,老师的任务是把尽可能多的东东教给大家,因为他不知道以后你做什么工作,哪些知识没用,因此,学校老师会尽量培养大家描述复杂问题的能力,这就造成了,学校里面的考试,是尽量把问题复杂化,多考察大家几个项目。学校里面的风气,也认为能解决复杂问题算高手,甚至问题本身不复杂,大家把它造复杂,来考核自己的能力。

但实际工作中不是这样的,实际工作中,大家最看重的是能用最简单的办法解决问题的能力,因为这样成本最低,无形中,大家赚钱最多。所以,对问题的抽象拆解和清晰描述非常看重。

很多同学刚刚上班,会很不适应,其实就是这个思路的转换。学院里,以复杂为美,而商业公司中,以简单为美。这应该是一个很大的思想转变,甚至是世界观的改变,很难的。一般转的比较快的同学,在公司里面进步就比较快,但我也见过工作几十年了,还是没有转过来的程序员,一般在公司里面活的就比较累一点。

建议大家好好思考一下我今天的提法,看问题抓本质,只要能及时理解商业公司的开发思路,理解简单这个要素,我不敢说大家一定能找到工作,但只要找到了,在公司里面,基本都能快速融入公司。

一块内存如果有多次free,就会使程序崩溃!!!

受教了!


c在爱情的含义是什么
C指的是现在流行的C型爱情观。 C型爱情观 “C型爱情观”指的是对现代爱情关一种新的定义。在爱情中,有进有退、牵手分手的循环,已不再是个稀奇风景,而“有始有终”,在“C型爱情观”中有了崭新的定义——有开始,就必有终了之时。 它的最大特点在于人们不再将青春耗损在不良关系上。 C型人生取代了线型...

c在化学中指什么意思
C在化学中有两种含义:1、表示浓度,单位为mol\/L,计算式为:C=n\/V. C=1000ρω\/M。含义:以1升溶液中所含溶质的摩尔数表示的浓度。以单位体积里所含溶质的物质的量(摩尔数)来表示溶液组成的物理量,叫作该溶质的摩尔浓度,又称该溶质物质的量浓度。溶质含量越多,浓度越大。浓度可以用一定...

女生发个c是什么意思啊
女生发个c是什么意思啊1 c的意思是 娘 就是说人 默默唧唧 不太爷们 形容词,c即cissy,而cissy=sissy,sissy意为柔弱或怯弱的男孩、女孩子气的男孩 很c的gay,就是指娘娘腔的gay。c字母起源 1、字母C的产生可能是由于一个投掷棒的符号,像在古埃及的'象形文字里并很早出现在闪族的书面当中-...

c是什么意思?
c++的具体含义如下:C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有计...

c是什么意思?
c++的具体含义如下:C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有...

c是什么意思医学
c是什么意思医学1 它是放射科的一种检查,叫CT泌尿系造影,就是在腹盆CT的基础上进行加工重建使两侧肾脏、输尿管及膀胱显示出来,c的意思就是颈椎,比如c4就是第四颈椎 c什么意思 大写C代表 在化学中,表示碳的化学符号 在乐理中,表示:音阶中的C音 调号中于C音开始的音乐的C大调及C小调 拍子...

排列组合的C是什么?
C是组合:比如ABC中选2个组合。那么AB,BA算一种组合,一共有AB,AC,BC三种组合。P是排列:(人教版把P写成A) 比如从ABC中选两个排列,那么AB,BA算两种组合,一共有AB BA AC,CA,BC,CB六种排列。从n个不同元素中,任取m(m≤n,m与n均为自然数)个元素按照一定的顺序排成一列,叫做...

数学中c怎么计算
组合数C(n,m)的计算公式为:例题:

排列组合c是什么意思?
排列组合是组合学最基本的概念。所谓排列,就是指从给定个数的元素中取出指定个数的元素进行排序。组合则是指从给定个数的元素中仅仅取出指定个数的元素,不考虑排序。排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。排列组合与古典概率论关系密切。排列组合c的公式:C(n,m)=A(n,m...

c开头是什么车
C字头的列车是城际动车组列车。城际列车,又称城际专列(Inter-City Rail Service),是指往返于相邻重要城市或城市群之间的客运列车,一般全程运行距离较近、乘车时间较短、途经城市较少,不配置卧铺车厢。和谐号动车的车型,由原来的动车型号D改为C,并将其命名为城际轻轨。 (G字头车次是指高铁)高铁...

乐山市18011163391: 求C语言编程思想,技巧的心得,体会. -
尧胡朗德: 良好的编程习惯是很重要的. 首先,在编程前要从整体上把握,组织;使用UML分析. 然后,在编程中尽量不使用怪癖的语句算法,注意代码排版. 接下来,一定要会使用、经常使用注释! 最后,调试要有耐心,要细心. 说些其他的,就是一定要谦虚,不要一心认为自己总是对的,学会交流. 其实每个人都有自己独特的风格,自己怎么舒服就怎么来,但前提是要保证别人可以看懂你的程序. 希望对你有所帮助.

乐山市18011163391: 刚开始接触C,向过来人求心得 经验,注意事项,
尧胡朗德: 如果刚接触到编程,首先要理解循环,这个以后程序的基础 C的难点是指针,这也是C 的优越点和弊端.到了C#指针就被取消了编译器推荐Visual stido 6.0这个版本,毕竟现在微软占主导地位 要学好一定要多练习,实践,看书只是辅助,动手最重要 C++和C有很多共同点,Visual stido C++ 6.0同时兼容C和C++ C#是微软主推的语言,专门为.NET框架而开发的新语言,是面向对象的语言

乐山市18011163391: 谁有学习C++的心得了???
尧胡朗德: 除了多动手编程几乎没别的了,也可以参考一些比较好的资料,或者多和其他学习C++的人交流思路. 还有就是尝试着一道题多种解法.

乐山市18011163391: C语言学习方法和心得 -
尧胡朗德: 1、学习C语言,要从入门到精通,需要读哪些书(从简单的到难的排序,越详细越好,最好都能注释下选择这本书的理由)? 入门阶段:还是老谭那本. 理由:虽然不能说它写得有多好,但是你现在要做的是入门,要快速的掌握c的基本语法...

乐山市18011163391: 如何学好C++ -
尧胡朗德: C++实际上是在兼容C语言的基础上扩展了面向对象的部分,其实你开始学C++一定是从基础部分开始学,也就是在学习C的语法和函数库,之后还包括过程化的编程思想,不过到了面向对象部分,就开始进入了C++的底盘了,那个时候你要将你...

乐山市18011163391: 我是C语言初学者,我想听听高手的心得
尧胡朗德: 我也不同意1楼的,C语言只是主要用来写内核或服务器程序,因为它运行速度够快,所以底层的东西都是用C语言编写的,而C++与JAVA就很难做到这一点,虽然C++与JAVA使用方便,但都没有C语言运行效率高,C语言编译成的程序在效率上能达到汇编语言的80%,JAVA敢来比么..? 如果系统内核用JAVA来写,那不是和手机一样了么(慢!).? 所以要针对你所从事的领域去选择,如是系统或服务器核心技术开发,那就是C,如是网络编程,那就是JAVA,如是普通的软件但又要求效率和可重用性,那就是C++. 各种语言都有各自的好处,不能盲目批判的.

乐山市18011163391: C语言编程体会 -
尧胡朗德: 主要是多上机操作,不懂的请教高手,多看一些程序,弄懂其编程思路,搞懂每一句的作用.谭浩强的那本教材非常好,建议看那本教材.

乐山市18011163391: c++编程,虽然很简单,但是对于一个初学者,还是很难.求大神帮助
尧胡朗德:C语言已经很不简单了,C语言属于较底层的编程语言,需要精通算法,如果精通C那不用找工作,而是工作找你,相对于C,C++稍容易一些,因为有些类,已经由开发者用C给你编写好了,你直接调用就行,但是大部分的类还是需要自己开发,也并不是好掌握的.总之精通C语言,比会用JAVA、.NET的程序员不是个层次的.

乐山市18011163391: 关于学习C++的问题
尧胡朗德: 学习C++先从C学起应该较好,虽然前者是面向对象的,后者是面向过程的,但是其基本语法还是一致的.至于书么,谭浩强的那本C程序设计,就是C的基础,很容易上手! 至于学习心得,这种东西那就是多练习,没有捷径! 祝你成功!

乐山市18011163391: 学习C++的技巧
尧胡朗德: 通常来说,学习c++首先要学习c,因为学了c之后,c++就变得很简单了,只是要在编程思想上有一个转变过程 学习任何一门编程语言,最快、最有效的方法就是写代码,把自己看到的、想到的统统用代码实现一遍,在编写代码的同时,你才能真正的发现到底那里不懂或者不知道,然后就可以有目的地去查阅资料,咨询老师等等. 学习编程,最忌讳的就是整天捧着本书翻来翻去,你就是翻100遍,也不如亲自把代码写一遍.如果你想在c++方面有所发展的话,一定要注意学习数据结构,为STL学习打下基础.在学习STL的时候,代码的实现就显得更加重要,如果只是看书的话,基本上是学不到什么的,我前一阵子就在学STL,感受很深...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网