电脑报官方论坛

 找回密码
 注册
楼主: wangweinoo1

编程及C/C++初学者 FAQ     [复制链接]

一代宗师

【风云堂】堂主

Rank: 12Rank: 12Rank: 12

树叶
1181
金币
169
积分
1737

斑竹纪念章 织网者(站长大本营) Programmer(编程魔方)

发表于 2009-5-30 07:42:02 |显示全部楼层

回复 10楼 大豆 的帖子

欢迎加入编程魔方版块的学习与交流!
:)

中流砥柱

不放弃地追呀追呀追呀追......

Rank: 8Rank: 8

树叶
0
金币
6687
积分
331
发表于 2009-5-30 15:58:40 |显示全部楼层
弄了个"CodeBlocks"的编程软件来学习,这东东好么?
http://img4.user.55.la:81/anonymous/banner/2012/12/27/00/9323057.gif
水星教主的十二号保镖

一代宗师

【风云堂】堂主

Rank: 12Rank: 12Rank: 12

树叶
1181
金币
169
积分
1737

斑竹纪念章 织网者(站长大本营) Programmer(编程魔方)

发表于 2009-5-30 16:05:02 |显示全部楼层

回复 12楼 天真无牙 的帖子

没用过,好像也是个集成了MinGW的开发环境
应该蛮好用的!
:)

Rank: 2

树叶
0
金币
209
积分
9
发表于 2009-6-7 18:19:15 |显示全部楼层
很感兴趣,就是不知从何学起啊!!!! 多看看

Rank: 4

树叶
0
金币
495
积分
64
发表于 2009-6-8 15:25:03 |显示全部楼层
再看看

功成名就

Diva Dance

Rank: 9Rank: 9Rank: 9

树叶
60
金币
8855
积分
562

Programmer(编程魔方)

发表于 2009-6-9 16:42:44 |显示全部楼层
老实说,看到里面的一些内容非常失望。
尽管C++之父亲口说,最好把C++看作一门新语言来学习,但我个人认为,一开始学习C至少有两大好处。相比C++,C还是非常简单的,易于掌握,避免你过早陷入C++的语法泥潭。同时,学C能让你对计算机的底层运行有所认识,建立良好的概念。

这明显是作者的主观臆测,经不起推敲。我不知道作者有没有真的看过 The Design and Evolution of C++ ,Bjarne 在书中明确指出,不要以为自己 C 学得很好,就觉得可以跳过 C++ 书籍中关于 C 基础的章节,因为这些章节中包函了大量的 C 语言使用者转 C++ 时经常犯的错误,以及在 C++ 环境中,不太好的 C 风格。如果这些基本的问题没有解决,那么将一直影响你对 C++ 的使用。
ps. 作者引用的“最好把C++看作一门新语言来学习”并不是出自本书,而是网络上到处都有的东西。

另外,C++ 求的是语义,语法是 C 赋予的,作者说“避免你过早陷入C++的语法泥潭”有失水准。

还有文章的最后部分,又落了俗套,什么“手中无剑,心中也无剑”,说得好像很玄妙,其实对于人的进步没有一点帮助。这都是人没有达到那个水平时胡乱猜测的结果,集中地体现出浮躁的心态。其实不然,对于一个老手来说,由于对手头的工具有足够广和足够深的理解,他们对于很多东西都够熟练,所以才会让人们感到他们似乎什么都没想,就解决了问题。这是因为由于长期的实践,老手们对工具的理解进入了更深层次的意识中,而当他们处理问题的时候,这些意识便从深层中浮现出来,重新组合,发生新的联系,或者以新的角度思考,从而解决了问题。而这些新意识通过他们的总结和提升,便又成为了他们下一次可以使用的深层意识。因此实践和总结才是提高自身能力的方式,而不是一味地强调什么根本不存在的无形和有形。

更严重的是,作者陷入了叙述的怪圈。澄清一些基本概念固然重要,我也很欣慰作者能提到算法和数据结构,但这些毕竟是其次。知识是人永远都讲不完的,真正负责任的初学者指导应该能启发初学者如何认识他们看到的新事物,应该启发他们多独立思考,而不是一味听信某些权威人士的话,或者只是从表面上理解老手的经验。就比如大家都认为本机程序比远程程序运行得快,但就是有人证明了远程程序有时运行得更快。他们是怎么发现这一点的呢?靠的便是独立思考和明辨是非的能力。初学者最应该得到的便是明辨是非的能力,也就是意识到别人和自己的错误的能力。如果没有这项能力,那么初学者便永远只会停留在人云亦云、浅尝辄止之中。这也是现在很多人所犯的根本性错误的源头之一。然而文章的作者洋洋洒洒这么多文字中竟然只字未提。这是十分失败的。如何得到明辨是非的能力呢?还是实践和总结,而且是不断得实践和总结,从而使初学者能真正自我提升,而不是只会看别人提升的轨迹,这也正是这篇文章所缺少的。

ps2.现在对语言的非议多得去了,懒得再多讲其中错误的地方。不过我想,如果初学者们开始有明辨是非的能力,并且有意识地发现其中的错误的话,这篇文章还是有积极意义的。

[ 本帖最后由 xpycc 于 2009-6-9 16:50 编辑 ]
已有 1 人评分评分 金币 收起 理由
风云の三少 + 2 + 5 独到的见解! 不管是新手还是老手,仔细看

总评分: 评分 + 2  金币 + 5   查看全部评分

Rank: 3Rank: 3

树叶
0
金币
1917
积分
27
发表于 2009-6-9 17:40:25 |显示全部楼层
看看内容!

Rank: 4

树叶
0
金币
3254
积分
59
发表于 2009-6-9 22:32:45 |显示全部楼层

回复 16楼 xpycc 的帖子

说得很好嘛,话说我找那篇“新帖”也花了番功夫……
作为一个初学者FAQ基本够了,我也没细看(我不负责任,我该打……)
关于那个玄妙的东西,怎么这么耳熟?哦,对在梁肇新的编程高手箴言
里MS见过……当然这本书很老很老了……
在1.2 高手是怎样练成的里这么说(引用,非本人观点)
程序员怎样才能达到编程的最高境界?最高境界绝对不是你去编两行代码,或者是几分钟能写几行代码,或者是用什么所谓的可视化工具产生最少的代码这些工作,这都不是真正的高手境界。即使是这样的高手,那也都是无知者的自封。

我认为,一个程序员的成长可分为如下六个阶段。

Ø         第一阶段

此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。

Ø         第二阶段

此阶段能精通基于某种平台的接口(例如我们现在常用的Win 32的API函数)以及所对应语言的自身的库函数。到达这个阶段后,也就相当于可以进行真实散打对练了,可以真正地在实践中做些应用。

Ø         第三阶段

此阶段能深入地了解某个平台系统的底层,已经具有了初级的内功的能力,也就是“手中有剑,心中无剑”。

Ø         第四阶级

此阶段能直接在平台上进行比较深层次的开发。基本上,能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。

这时已经不再有语言的束缚,语言只是一种工具,即使要用自己不会的语言进行开发,也只是简单地熟悉一下,就手到擒来,完全不像是第一阶段的时候学习语言的那种情况。一般来说,从第三阶段过渡到第四阶段是比较困难的。为什么会难呢?这就是因为很多人的思想转变不过来。

Ø         第五阶级

此阶段就已经不再局限于简单的技术上的问题了,而是能从全局上把握和设计一个比较大的系统体系结构,从内核到外层界面。可以说是“手中无剑,心中有剑”。到了这个阶段以后,能对市面上的任何软件进行剖析,并能按自己的要求进行设计,就算是MS Word这样的大型软件,只要有充足的时间,也一定会设计出来。

Ø         第六阶级

此阶段也是最高的境界,达到“无招胜有招”。这时候,任何问题就纯粹变成了一个思路的问题,不是用什么代码就能表示的。也就是“手中无剑,心中也无剑”。

此时,对于练功的人来说,他已不用再去学什么少林拳,只是在旁看一下少林拳的对战,就能把此拳拿来就用。这就是真正的大师级的人物。这时,Win 32或Linux在你眼里是没有什么差别的。

每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成,只要多用心去研究,耐心地去学习。

要想从第二个阶段过渡到第三个阶段,就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是,有些人到达第三个阶段后,常常就很难有境界上的突破了。他们这时会产生一种观念,认为软件无非如此,认为自己已无所不能。其实,这时如果遇到大的或难些的软件,他们往往还是无从下手。

现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的,不过这样的程序员一般在软件公司也能独当一面,完成一些软件的模块。

但是,也还有一大堆处在第一阶段的程序员,他们一般就能玩玩VB,做程序时,去找一堆控件集成一个软件。

现在一种流行的说法是,中国软件人才现在是一个橄榄型的人才结构,有大量的中等水平的程序员,而初级和高级程序员比较少。而我认为,现在中国绝大多数都是初级的程序员,中级程序员很少,高级的就更少了。所以,现在的人才结构是“方塔”形,这是一种断层的不良结构。而真正成熟的软件人才结构应该是平滑的三角形结构。这样,初级、中级、高级程序员才能充分地各施所长。三种人才结构对比如图1.1所示。
(wangweinoo1注:图略)

关于中国程序员的情况,我也不了解,不妄加评判。
但关于后来(未在上文)所述的“成对编码”(当然这是常识)、“代码的注释”、“变量定义的规范”等等对养成良好的编码风格还是有一定意义的。
第三章“Windows运行机理 ”也写得不错吧,最近一直想看<Windows 内核情景分析>,可惜买不起啊……
顺便说一下,在《C专家编程》里最后一章——“你懂得C,所以C++不在话下”……
已有 1 人评分评分 收起 理由
风云の三少 + 1 精品解析

总评分: 评分 + 1   查看全部评分

我是谁?

功成名就

Diva Dance

Rank: 9Rank: 9Rank: 9

树叶
60
金币
8855
积分
562

Programmer(编程魔方)

发表于 2009-6-10 08:03:41 |显示全部楼层
作为一个初学者FAQ基本够了,我也没细看(我不负责任,我该打……)

我没有要指责你的意思啊……
我只是谈了谈里面的时弊罢了,也就是现在很多人在犯的错误,所以拿出来大家讨论下而已。

顺便说一下,在《C专家编程》里最后一章——“你懂得C,所以C++不在话下”……

恕我冒犯,这种话根本一点用都没有。“掌握语言”是怎么定义的?就是一个人对语言有足够的深度和广度上的了解,能用它来解决问题。任何语法上和技巧上的问题到最后都不会成为大的障碍,各种高级语言给我们提供了良好的基础,关键看你怎么灵活应用解决问题。

你可以注意到 The C Programming Language 2rd 里的程序都是 C++ 程序。而且令我不解的是 VC 发展到现在都还只支持到 C95 ,这真是灾难……

就我个人而言,C/C++ 混合使用是再正常不过的事,我经常拿 C++ 编译器编译 C 程序,这大多是由于诸如 bool 这样的小问题。我也经常在 C++ 程序中插入经典的 C 段子。比如 iostream 和 stdio 的选择上。如果是一般的输入输出,我选择 iostream ,为什么?方便,我不用管太多格式上的问题,因为 iostream 重载了操作符,它自己会管理。然而在有些情况下,比如保留小数点后几位(注意和有效数字不同),我就会用 stdio ,还是因为方便,可以少打几个字符。
ps.不要以为 iostream 一定比 stdio 慢,传说 gcc4 的某版本及以后中 iostream 反而更快。

同样的,C 中的一些技巧也可以很顺理成章地继承到 C++ 中,比如
  1. for(i=0;i<N;++i)
  2.     out[i]=in[i];      // in and out point unto the beginning of two arrays
  3. //also
  4. for(;in!=eof;)       // eof points unto the next of the end of the array
  5.     *out++=*in++;
复制代码
在 C 中这些都是可行的,形式都很简洁,但是在 C++ 的某些情况下,比如迭代器,它们只重载了 operator++ ,因为它在逻辑上不需要也不能有 operator[] 存在,那么就只能用下面一种方式了。它的灵感来自哪里?当然是以往的 C 编程经验。

同样的,C++ 也促进了 C 的发展,这样的例子不要太多。仅以 const 关键字为例。const 是由 Bjarne 发明的,他提出这个建议后,和 Dennis 讨论过。Dennis 觉得这很好,为此 Bjarne 还被叫去开了一个 C 标准委员会,会上大家几乎想也没想就通过了这项决议,因为这是很自然的事,无论 C 还是 C++ 都需要 const 关键字。
ps2.不要以为有了 #define 就万事大吉,看看int printf(const char *format, arg_list)是什么。
这个问题的背景是当时 C 类型系统虽然经过部分整合但还是非常混乱,加强 C 的类型系统也是 C++ 最初的使命之一。你可以注意到,在最早的 K&R C 时代,函数不检查参数就可以调用。对,他们那个时候就是这么干的。

所以 C 和 C++ 是互相促进的,为什么?因为大家有相同的目标——更好地解决问题。再回到主题,如果有些激进的 C++ 程序员看了 C 书中的话不爽,然后在他的书或者社群中说“根 C++ 相比,C 实在太简单了”,然后引发了一系列相互攻击的事件,那就是莫大的悲哀了。然而事实证明,是我杞人忧天了。我还没有在任何 C++ 书中看到这样的无聊的言论。

如果你真想搞清楚 C++ 是什么样的或者想用 C++ 干活,那还是去买本正统的 C++ 书,静下心来看。如果你想搞清楚 C 和 C++ 的复杂关系,那就多买几本 C 和 C++ 的书,注意两方面的书都应该多看。个人经验是,如果有矛盾出现,不妨从历史的角度来看待事物,因为事物在发展的最初阶段,他们往往更简单明了,错误也更少,即使有错误,也是很明显的。如果直接就从较后面的阶段着手,那么他们可能是有许多优点,克服了许多弊端,然而他们也可能隐藏着巨大的灾难和误区,或者更难以令人理解。
ps3.厄,看来你对 C 语言感情太深了,跟我当年对 Pascal 一样……

[ 本帖最后由 xpycc 于 2009-6-10 08:22 编辑 ]

Rank: 2

树叶
0
金币
391
积分
10
发表于 2009-6-11 02:15:12 |显示全部楼层
好东西。。。谢谢楼主分享。。。
http://blog.sina.com.cn/fengkuangdeyaojing
您需要登录后才可以回帖 登录 | 注册


感谢版主

Archiver|手机版|电脑报官方网站 ( 渝ICP备10009040号 

GMT+8, 2017-10-21 14:43

回顶部