原创 “C++之父BS说林锐错了”之原因收藏

新一篇: MSDN库说明 | 旧一篇: C++之父BS说林锐错了

“C++之父BS说林锐错了”之原因

前天发了一个贴子“C++之父BS说林锐错了”
C++之父的C++圣经《C++程序设计语言 特别版》中说:
大家不要听某些人说判断指针是否为空用(p==NULL)或(p!=NULL)的格式,C++之父认为这样写是不好的,提倡直接写(p)或(!p)的形式。

林锐在国内程序员界也是大名鼎鼎的人物,有大作《高质量C++/C编程指南》,说判断指针是否为空要用(p==NULL)或(p!=NULL)的格式,别用(p)或(!p)的形式。

那么大家听谁的呢?

我认为是C++之父BS的正确。
理由暂且不说,读者可以自己想一下了。

-----------------
现在我说一下我的理由。

1.如果一个语言要程序员用p==NULL的形式来标志那是一个指针,那么这个语言的设计一定是拙劣的。
2.如果语言并不要求程序员用p==NULL的形式来标志那是一个指针,但程序的设计架构却要求,那么这个程序的设计架构一定是拙劣的。
3.如果语言与程序总体设计架构都不要求程序员用p==NULL的形式来标志那是一个指针,但是程序员自己却非要这么做才能容易的识别出指针,那么这个程序员的编程方式就一定是拙劣的。
4.如果语言、程序总体设计架构与程序员自己都不需要用p==NULL的形式来标志那是一个指针,但是还是仍然非要这样做,那简直……

类型信息不应当也没必要非在这里出现不可。99%的情况下在变量名本身中已经体现出来了,其余的是在环境中一目了然。

我用的是这种方式,
1.所有的逻辑0判断都是用(p)(!p)的方式。比如指针和用于逻辑标志的整型都是这样,当然bool型的也是这样,不过我还几乎没用过bool型呢。
2.仅与数字0在数学意义上进行比较时才写成(i==0)的形式。
比如if(i>0){...}else if(i==0){...}else {...};
不以数据类型区分比较的写法,而是以用途意义。说白了还是那句话,怎么想就怎么编,HTHC(“HOW THINKING HOW CODEING”),直接描述出来自己的思维。
逻辑判断就用(p)(!p),数字判断就用(p==0)(p!=0)也可以用(p)(!p),就这么简单。
如果都用成了(p)(!p)还有一个好处,一见到这样的就知道是在与0比较呢。识别非常快。

用那种NULL的形式,多输入一个字符就给以后维护时增加一点麻烦,多输入一个字符的本身也给编程多带来了一点麻烦,如果问这点麻烦怕什么,可是在高度复杂严谨的思维过程中不希望有任何这样无用冗余麻烦,任何这样的麻烦都会干扰思路。

至于NULL==p的形式,表面上这是可以防止if(p=NULL),但是现在编译器完全可以对这样的提出warning,而且有许多成熟的代码工具可以检测出这些异常代码,小时候我还不知道有这样的工具曾经自己写了一个。
要知道流畅思维描述形式往往是p==NULL,那么写成NULL==p就干扰了这种流畅的思维,虽然仅仅是一点点,但是在高度复杂严谨的思维过程中要求的是一点点这样的干扰都不要有,这样写就干扰了代码的直接表义性,违反了“怎么想就怎么编”,违反了“最小惊讶原则”。

甚至连const我也是尽量避免使用,如果一个程序需要用const去维护其健壮性,那么说明这个程序的整体设计有问题,我认为程序员不应该依赖这些来给自己的程序查错,这样的依赖往往带来更大的隐患。

总之,写有自描述能力的代码,HTHC。

(还有几点,现在暂时想不起来了,等想起来了补上) 

发表于 @ 2006年07月03日 22:17:00|评论(loading...)|编辑

新一篇: MSDN库说明 | 旧一篇: C++之父BS说林锐错了

评论

#universee 发表于2006-07-03 22:32:00  IP: 218.59.150.*
还有一点好处:有份比较流行的C++面试题,一上来就是问int,bool,指针,与0比较的方式。
标准答案是林锐书中给的那个,很麻烦的,那么以后就可以都写成(p)(!p)的形式了,当然int可以分两情况,起逻辑作用时写(p)(!p),起数字作用时写(p==0)(p!=0)。
主考官如果说你的答案跟林锐书中的不一样,你就说C++之父的做法也跟林锐书中的不一样,
#dayforever 发表于2006-07-04 14:57:00  IP: 218.71.249.*
无知!!
bs从语法设计的角度,看这个问题
林锐从多人协作的角度来看这个问题

你从门缝里看这个问题

甚至连const我也是尽量避免使用
你懂得const 的含义吗?你知道为什么c++比c推崇使用const吗?

看看你的那个什么太极语言,就知道了,不过就是一个不懂装懂的人

#火狐设计 发表于2006-07-04 13:35:00  IP: 221.5.148.*
这位老兄一定是一个高手,我也期待你能够把这篇文章写下去。
我更希望在下面的内容中,看到在不使用const的代码中,如何保证程序的健壮,我想这一定和个人的经验有关,希望能够和你分享这个经验。
#universee 发表于2006-07-04 19:33:00  IP: 218.59.150.*
“但是不管从软件开发规范角度还是从代码可移植性角度考虑,用NULL格式标志指针都是不应该被大力提倡的。这也是BS反对的。

而且BS的书真不愧是大师级作品,考虑的是方方面面,并没有更多或重点的考虑“代码可移植性”


引自我在CSDN论坛上的回贴。
http://community.csdn.net/Expert/TopicView.asp?id=4855036

不管从语法设计还是多人协作角度看,都不应该用NULL格式标志指针,即使用NULL,可是也不能从那是标志一个指针的角度去用。

BS的书不只是从语法设计的角度考虑的,你不要低估了这样的大师,他提倡不用NULL格式是很有道理的。


关于const的争论,看看H.Sutter的《Exceptional C++ Style》中怎么说的吧。滥用const是有害的,不要受一些C++入门书的误导
#universee 发表于2006-07-04 19:35:00  IP: 218.59.150.*
火狐设计,其实在C中不用const已经有足够可靠的措施来做这些事情了,你可以去看很多的开源代码中是怎么做的,
#清风雨 发表于2006-07-04 20:57:00  IP: 61.173.92.*
说真的,名家的解说肯定是很有道理的。但,对于听众切不可偏听,而深以为然。
关于p != NULL和const,我和作者的观点正好相反。
首先,if( 表达式 ),这里的“表达式”是bool表达式(在java里明确,才C/C++里并没有明确)。对于一个判断,从用户(这里是程序员)角度,bool更容易理解。
其次,NULL可以明确的让用户明白是指针(指针和NULL比较;数字和0比较;bool直接判断)。
还有,由于第二条的好处,你可以很方便的查找指针有效性判断。
至于const,上次也听说到过觉得不用他的好。其实,const是一个修饰,提供了附加信息和编译期辅助,虽然你不需要这些辅助也可以让你的程序跑起来正确,但是,用了const可以给你很多帮助,因为const表示了不会修改,可以帮助你排除不小心的错误 —— STL里可是到处都是const,另外,多线程const会给你有利的帮助。
#IT_Walter 发表于2006-07-04 22:28:00  IP: 203.190.97.*
是coding不是codeing
#fasiondog 发表于2006-07-04 23:50:00  IP: 219.134.34.*
支持dayforever、清风雨
从工程的角度来说,我对不使用NULL和使用const也有怀疑,在大型项目的情况下,由于人对复杂事物思考的局限性,会出现很多问题
#dayforever 发表于2006-07-05 11:14:00  IP: 60.179.108.*
"看看你的那个什么太极语言,就知道了,不过就是一个不懂装懂的人" 我为这句话表示歉意... 不应该人生攻击...

“但是不管从软件开发规范角度还是从代码可移植性角度考虑,用NULL格式标志指针都是不应该被大力提倡的"
这里指 代码可移植性 , 注意是移植,而不是多人协作

如果你参加过团队项目的开发,看别人的代码的时候会发现,如果哪指针与NULL作判断,你会直接掠过,因为你知道其中的含义。
如果直接if(p) 你可能会考虑p是什么,是bool还是其他的什么,有些人写出来的代码中甚至会有
float a;
...
if( a )
...

这样的代码.... 即使自己写的,大概半年之后你就看不明白了

也就是说这样写 可维护性 差

H.Sutter说的是滥用const 而不是不用,请不要曲解
这和在c中使用define 和 滥用define 是一个道理


#. 发表于2006-07-05 13:20:00  IP: 218.25.195.*
还好不用c++,不过我以前学过c++谁的书也都看过,比较喜欢p==null这种写法,这样很直观,从软件可维护的角度我愿意这么写只要他不出错误
#路人甲 发表于2006-07-06 13:25:00  IP: 210.22.93.*
支持清风雨的观点。

如果写成if (p),经常要判断p是什么类型的变量,阅读代码时至少要拐个弯才行。
#aaa 发表于2006-07-06 18:55:00  IP: 220.248.0.*
草,大家无聊不无聊啊,争论这种鸡毛蒜皮的东西。。爱写什么写什么去,我就不信写C++的人有看不懂if (!p)的。省下时间研究一点有意义的东西吧。
#ddgf 发表于2006-07-07 10:22:00  IP: 221.224.52.*
如果一个语言要程序员用p==NULL的形式来标志那是一个指针,那么这个语言的设计一定是拙劣的。
---------------------------------------------------------------
说这句话的人才是拙劣的!!!
#S27 发表于2006-07-07 11:23:00  IP: 221.222.191.*
支持清风雨的观点

从你所谓的理由来看,你还没明白理由、结论和骂街有什么区别,你指责别人是拙劣的,但你没说明任何的理由,如果C++之父这样指责,我想他也不配称作C++之父了!
#dohkoos 发表于2006-07-07 17:34:00  IP: 221.6.3.*
作者的观点完全错误。清风雨说的比较明确了,if(condition)中的条件应该是bool类型。
假如象C++之父说的用if(p)来表示,那么当p<0时if块中的内容也会被执行,而p<0实际上就是说p不指向任何内存。大家可以执行下面的程序看看

int main(int argc, char* argv[])
{
int *p;
p = reinterpret_cast<int *>(-8);
if (p) {
*p = 9;
}

return 0;
}
结果出现了问题。
作者自己还没用过bool类型,就大肆说C++中的if(p)是一种优雅的解决方案,不用这种方案的就是拙劣的。可是我要说如果用了bool类型,那么就会看到c++的这种设计是多么的拙劣和丑陋。

#to dohkoos 发表于2006-07-08 01:19:00  IP: 59.33.90.*
那么请问怎样在你的程序里判断p是可以写的呢?
声明我比较喜欢NULL的做法也比较喜欢a==0的做法,节约这点代码没必要。
#小雨 发表于2006-07-08 10:00:00  IP: 222.240.13.*
可以很清楚的知道,楼主环顾左右而言他,没切中要害,却要误导很多,罪过罪过,国内这种人以后要少点才好,多少初学者就是被这样的人害死的
#universee 发表于2006-07-08 10:09:00  IP: 218.58.176.*
要怪你就去怪裘教授吧,还有C++之父BS,按你说的他们都是在误导初学者了。

认为这个问题没意义的说明很可能还没经历过大项目的开发。

大家先讨论等适当的时候我再说一些
#pgmsoul 发表于2006-07-09 07:18:00  IP: 60.10.56.*
if(p==0)这一句,你就知道P是什么类型吗?bool类型没能必要,虽然if后面的东西本质上是bool,但p和!p在这里就是说是否为0,(干嘛把0叫NULL呢?在0这一点上所有类型差别都消失了).C++在很多时候过分强调形式了,简单最好.我几乎不用const.听说它也会占用内存,宁可用个宏.
--------------------------------------------------------------
那么当p<0时if块中的内容也会被执行,而p<0实际上就是说p不指向任何内存
------------------------------------------------------------
非也.p不会小于0的.如果它是个指针.
----------------------------------------
float a;
...
if( a )
...

这样的代码.... 即使自己写的,大概半年之后你就看不明白了
-----------------------------------
这里if(a)是一种非常不好的写法.但楼主说的是判断指针,C++应该认为if(a)是一种错误的写法,也就是说if后面必须是一个整数,(而不必是bool).
限制为bool类型更规范,但不实用,建议改为整数类型.
#Jav 发表于2006-07-10 20:15:00  IP: 61.173.159.*
我来告诉你吧.

BS说不用NULL的原因是NULL并不算是一个正统的C++的东西. 另外, NULL的定义是一个宏, 并不可靠. 他的理由也是成立的(他从维护C++的单纯性考虑).
但是现实的情况是NULL是很普遍用到了, 你想废除也废除不了了, 另外, NULL的定义除了宏之外还真找不到别的方式来替换. 而同时NULL可以增加可读性, NULL在程序中也非常有用. 何不用之?

#Jav 发表于2006-07-10 20:02:00  IP: 61.173.159.*
现在我说一下我的理由。

1.如果一个语言要程序员用p==NULL的形式来标志那是一个指针,那么这个语言的设计一定是拙劣的。
2.如果语言并不要求程序员用p==NULL的形式来标志那是一个指针,但程序的设计架构却要求,那么这个程序的设计架构一定是拙劣的。
3.如果语言与程序总体设计架构都不要求程序员用p==NULL的形式来标志那是一个指针,但是程序员自己却非要这么做才能容易的识别出指针,那么这个程序员的编程方式就一定是拙劣的。
4.如果语言、程序总体设计架构与程序员自己都不需要用p==NULL的形式来标志那是一个指针,但是还是仍然非要这样做,那简直……

-----------------------------------------------
原因呢? 为什么说这样一定是拙劣的?
你告诉大家"p==NULL不好"的原因就是"p==NULL一定是拙劣的", 这算什么逻辑?



最瞧不起这种针对论题找不到论证的时候, 就扬扬散散写一大堆文字的家伙了.
支持NULL跟指针比较的人的理由是:
1. 代码清晰, 易读.
2. NULL的定义可扩充性, 现在的习惯是指向0x0这个错误的地址, 假设这个地址也被用到怎么办? 更换NULL的定义就可以!
楼主的理由是:
1. C++之父BS提倡不用NULL
2. "p==NULL"一定是拙劣的


楼主, 千万别给我这个回帖也回超长的一段话来解释, 有什么反驳的意见就直接明了的给出理由.
#Jav 发表于2006-07-10 20:32:00  IP: 61.173.159.*
小朋友, 我来一点点指出你的问题.

所有的逻辑0判断都是用(p)(!p)的方式。比如指针和用于逻辑标志的整型都是这样,当然bool型的也是这样,不过我还几乎没用过bool型呢。
-------------------------------------
现在判断指针无效是用地址0x0, 这是一个不成文的规定, 但不是强迫性的规定, 如果将来有某种机器要用别的地址表示无效地址, 你的程序都是跟0比较的, 是不是都要重新改代码啊?



至于NULL==p的形式,表面上这是可以防止if(p=NULL),但是现在编译器完全可以对这样的提出warning,而且有许多成熟的代码工具可以检测出这些异常代码,小时候我还不知道有这样的工具曾经自己写了一个。
-------------------------------------
已经习惯写NULL==p了. 依靠编译器给出警告提示还不如事先处理好. 你说你小时候写过个可以防止if(p=NULL)的工具, 那你能不能共享出来给大家看看, 你小时候是几岁的时候? 小时候就会用C++的人不多的哦, 至少我是从来没有见过.



甚至连const我也是尽量避免使用,如果一个程序需要用const去维护其健壮性,那么说明这个程序的整体设计有问题,我认为程序员不应该依赖这些来给自己的程序查错,这样的依赖往往带来更大的隐患。
-------------------------------------
先去检查一下你的脑子是否正常, 你又来一套怪异的理论了. "const不用"的原因是"用const说明这个程序的整体设计有问题"? 给个具体的可以让人清楚的理由好不? 别动不动就来一篇八股文一样的, 唧唧歪歪的不知道说啥, 让人稀里糊涂的.

#universee 发表于2006-07-10 20:33:00  IP: 218.58.176.*
别曲解我的话,我说的是“用p==NULL的形式来标志那是一个指针”的做法是拙劣的,不应该这样标志它是一个指针。

如果说有必要标志这个p是个指针,
那么这个p在if判断中用p==NULL的形式标志了,可是还有无数的其他语句怎么标志呢?

如果p要用p==NULL的形式标志是一个指针,其他的语句怎么标志呢?

如果说其他的语句不需要标志了,那么为什么非要在if中标志呢?

这就导致了悖论。

p=NULL的写法有时是必要的,我并不是说要废除这种写法,只是说不要用这种形式去判断是不是一个指针。

可以让p的名字自身来带这标志是一个指针的信息
#universee 发表于2006-07-10 20:38:00  IP: 218.58.176.*
现在判断指针无效是用地址0x0, 这是一个不成文的规定, 但不是强迫性的规定, 如果将来有某种机器要用别的地址表示无效地址, 你的程序都是跟0比较的, 是不是都要重新改代码啊?
----------------------
你以为C++的爸爸没考虑到这个问题吗?


已经习惯写NULL==p了. 依靠编译器给出警告提示还不如事先处理好. 你说你小时候写过个可以防止if(p=NULL)的工具, 那你能不能共享出来给大家看看, 你小时候是几岁的时候? 小时候就会用C++的人不多的哦, 至少我是从来没有见过.
--------------------------------------
NULL==p,干扰了代码的直接表义性,违反了“怎么想就怎么编”,违反了“最小惊讶原则”。


const在C++社区里的争议也是不断有的
#universee 发表于2006-07-10 21:56:00  IP: 218.58.176.*
现在判断指针无效是用地址0x0, 这是一个不成文的规定, 但不是强迫性的规定, 如果将来有某种机器要用别的地址表示无效地址, 你的程序都是跟0比较的, 是不是都要重新改代码啊?
----------------------
你以为C++的爸爸没考虑到这个问题吗?


已经习惯写NULL==p了. 依靠编译器给出警告提示还不如事先处理好. 你说你小时候写过个可以防止if(p=NULL)的工具, 那你能不能共享出来给大家看看, 你小时候是几岁的时候? 小时候就会用C++的人不多的哦, 至少我是从来没有见过.
--------------------------------------
NULL==p,干扰了代码的直接表义性,违反了“怎么想就怎么编”,违反了“最小惊讶原则”。


const在C++社区里的争议也是不断有的
#Jav 发表于2006-07-10 22:18:00  IP: 58.24.140.*
现在判断指针无效是用地址0x0, 这是一个不成文的规定, 但不是强迫性的规定, 如果将来有某种机器要用别的地址表示无效地址, 你的程序都是跟0比较的, 是不是都要重新改代码啊?
----------------------
你以为C++的爸爸没考虑到这个问题吗?
----------------------
那好, 你既然貌似那么了解他, 请问你, 他对这个问题的解决方案是什么?



已经习惯写NULL==p了. 依靠编译器给出警告提示还不如事先处理好. 你说你小时候写过个可以防止if(p=NULL)的工具, 那你能不能共享出来给大家看看, 你小时候是几岁的时候? 小时候就会用C++的人不多的哦, 至少我是从来没有见过.
--------------------------------------
NULL==p,干扰了代码的直接表义性,违反了“怎么想就怎么编”,违反了“最小惊讶原则”。
--------------------------------------
你自个编扯出来的鸟原则, 唧唧歪歪的扯啊扯, 小学数学教过等价交换原理你知道吗? 你倒是说你小时候几岁写过个防止p=NULL警告的工具啊? 东西呢? 拿出来让人看看啊?


const在C++社区里的争议也是不断有的
--------------------------------------
争议什么? 既然你说在C++社区里面关于const很多争议, 那你给些关于const争议的地址让别人自己去看看.
#cppof286 发表于2006-07-19 08:59:00  IP: 207.46.89.*
Bjarne老头子对NULL的态度在D&E里就说过了,null指针在C++中的表示永远是零,但是对某些不以0x0作为NULL地址的体系,编译器应该在生成object code的时候进行自动转换。所以用int保存指针地址实际上也是不安全的。至于NULL,他在D&E预处理的一章中希望最终能彻底在C++中禁止使用宏(Banning C++),当然也就不希望大家是用NULL。


最小惊讶原则不是C++的而是Ruby的,拿来约束C++未免不太合适,何况《程序员》杂志当年登的对Matz的访谈中这位兄台也说过,他用C++很多年了,但是C++仍然能经常让他感到惊讶。


“怎么想就怎么编”,楼主啊不是我和你过不去,不过劳烦阁下先把您的名字加在这句话前面,感觉更准确一些。


我用google上的新闻组看comp.lang.c++/comp.lang.c++.moderate/comp.lang.c也算有三年多了,C++社区中对const的争议我还真的没发现过,晚生孤陋寡闻,楼主可否给出一两个连接看看?
#cppof286 发表于2006-07-19 09:03:00  IP: 207.46.89.*
Sorry我写错了,应该是Banning Macro,不是Banning C++
#universee 发表于2006-07-19 13:55:00  IP: 60.211.197.*
cppof286 ,这几年里关于const的争议几乎看不到了,是更早的时候,上世纪我从一本C++书中知道的这个事情,书名忘了。特别是那时一些C转过来的程序员总对CONST能帮他们多大忙有怀疑。

“最小惊讶原则不是C++的而是Ruby的” ,不是吧,最小惊讶原则是独立于语言的咯,呵呵……

“我用google上的新闻组看comp.lang.c++/comp.lang.c++.moderate/comp.lang.c也算有三年多了”
高手啊,给你发EMAIL了,在cppof286@yahoo.com.cn
#universee 发表于2006-08-21 19:23:00  IP: 218.58.178.*
cppof286 ,微软的哥们,哈哈……
#隐神 发表于2006-11-22 22:55:00  IP: 61.142.212.*
/* 3.如果语言与程序总体设计架构都不要求程序员用p==NULL的形式来标志那是一个指针,但是程序员自己却非要这么做才能容易的识别出指针,那么这个程序员的编程方式就一定是拙劣的。*/

C++ 允许程序员使用奇技淫巧。而某些程序员使用奇技淫巧是为了自己的程序别人看不明,以显示自己是高人。

我斗胆在此说一句:不尽可能将程序写得别人容易写明白的程序员是鸟人!
#r_mosaic 发表于2007-05-15 14:01:45  IP: 211.167.159.*
哈哈哈,我想笑掉大牙了……
作者居然搬 BS 的话,而 BS 只是说 NULL 这个东西定义成 (void *)0 在 C++ 的概念中不对,从来没有说 NULL 本身不对,也没说过 p == NULL 不对……如果把 NULL 定义为 0 在 C++ 中是一种折衷的办法,当然由这个原因可以说 if (p == NULL) 可以化简为 if (p),但是,NULL 的好处在于可移植性。哪一天 NULL 是 -1 了看你怎么办……
#lxyyzm 发表于2008-05-14 12:23:14  IP: 218.18.102.*
发表一下个人看法:

1、NULL==p确实感觉很别扭,而且既然想到这样写的话,肯定就不会写成p=NULL了!

2、p==NULL非常直观,使人容易理解。写得麻烦一点是完全值得的。即使p的名字已经说明是一个指针,再在这里说明一下也不能说是拙劣的。写代码有点冗余不是什么坏事。清楚明了才是最重要的!!
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © universee