- 在线时间
- 1598 小时
- 最后登录
- 2012-7-8
- 评分
- 269
- 金币
- 8855
- 树叶
- 60
- 注册时间
- 2005-3-14
- 阅读权限
- 50
- 帖子
- 4186
- 主题
- 3
- 精华
- 9
- 积分
- 562
- UID
- 232034
  
- 树叶
- 60
- 金币
- 8855
- 积分
- 562
|
发表于 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++ 中,比如- for(i=0;i<N;++i)
- out[i]=in[i]; // in and out point unto the beginning of two arrays
- //also
- for(;in!=eof;) // eof points unto the next of the end of the array
- *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 编辑 ] |
|