C++之父BS说林锐错了
C++之父BS说林锐错了
C++之父的C++圣经《C++程序设计语言 特别版》中说:
大家不要听某些人说判断指针是否为空用(p==NULL)或(p!=NULL)的格式,C++之父认为这样写是不好的,提倡直接写(p)或(!p)的形式。
林锐在国内程序员界也是大名鼎鼎的人物,有大作《高质量C++/C编程指南》,说判断指针是否为空要用(p==NULL)或(p!=NULL)的格式,别用(p)或(!p)的形式。
那么大家听谁的呢?
我认为是C++之父BS的正确。
理由暂且不说,读者可以自己想一下了。
问题点数:0、回复次数:20Top
1 楼ChrisAK(LOLICON)回复于 2006-07-01 23:41:16 得分 0
not p和cmp p,NULL?Top
2 楼CUG122032(烫烫烫烫烫烫?烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫?烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫)回复于 2006-07-01 23:50:16 得分 0
各有各的好处吧...
那些人,C++搞多了,就钻牛角尖了...
表计较...Top
3 楼JasonHeung(拥有一切不过就这样笑着哭)回复于 2006-07-02 00:01:11 得分 0
两种写法区别何在
?Top
4 楼JinjianGZ(惘思)回复于 2006-07-02 00:05:09 得分 0
茴字有几种写法?Top
5 楼jxfengzi(子丰)回复于 2006-07-02 00:13:29 得分 0
两种写法区别何在
?Top
6 楼tidyduck(辨不清东南西北)回复于 2006-07-02 00:15:35 得分 0
C++这方面嘛,BS毕竟还是老大,听他的吧!Top
7 楼ybiori()回复于 2006-07-02 09:39:04 得分 0
明显C++老大的写法简单啊Top
8 楼liangqingzhi(老之)回复于 2006-07-02 09:46:15 得分 0
:)Top
9 楼icansaymyabc(学习与进步)回复于 2006-07-02 10:47:07 得分 0
林锐说的是对的。
Top
10 楼xwffwx(Don't call me chinese)回复于 2006-07-02 10:56:49 得分 0
想听LZ说理由,做记号Top
11 楼dellfox(幽谷之狐)回复于 2006-07-02 11:10:33 得分 0
(p==NULL)或(p!=NULL) 或 P 或 !P
这个是一样的,(p==NULL)或(p!=NULL)也没什么不好,但林锐说的不是这个,他说的是不要写:
(p==TRUE)或(p!=TRUE)
原因是TRUE就是1,而程序员写(p==TRUE)的本来意思是P!=0,这样,当P==2时,就会出错,而改为P 或 !P 就不会了。C++中布尔类型是这样的:0为假,其他数值为真,并不是只有1才是真。
管他谁有名,我只认理。Top
12 楼colcn88((散花)只想让家里人过得更好)回复于 2006-07-02 11:15:03 得分 0
林锐写的书
太一般Top
13 楼liufu627(lf)回复于 2006-07-02 11:23:50 得分 0
空指针为0X00,
C++ IF语句判断表达式为整型的时候,表达式结果为0,则判断条件为假;否则为真。
如果采用大师的写法IF(p)或(!p)是一定正确的,
如果采用林锐的有可能出错,因为NULL有可能被定义成其它,而非0Top
14 楼djfu(飞龙在天)回复于 2006-07-02 11:28:53 得分 0
支持if(p == NULL)//指针
if(p) // bool值, 不确切Top
15 楼tomtom123(abc)回复于 2006-07-02 11:48:46 得分 0
MARKTop
16 楼universee(吾乃太极语言之父)回复于 2006-07-03 22:34:26 得分 0
“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。
(还有几点,现在暂时想不起来了,等想起来了补上)
Top
17 楼ttjacky(豆豆糖)回复于 2006-07-03 22:49:05 得分 0
林锐现在干啥去了?Top
18 楼BeginnerCpp(禅)回复于 2006-07-03 23:00:39 得分 0
至于NULL==p的形式,表面上这是可以防止if(p=NULL),但是现在编译器完全可以对这样的提出warning,而且有许多成熟的代码工具可以检测出这些异常代码,小时候我还不知道有这样的工具曾经自己写了一个。
===============
大概只有50%的概率,编译器会发现"=="误写成"="的错误.
实践数据.
甚至连const我也是尽量避免使用,如果一个程序需要用const去维护其健壮性,那么说明这个程序的整体设计有问题,我认为程序员不应该依赖这些来给自己的程序查错,这样的依赖往往带来更大的隐患。
================
......
任何变量声明出来没有第一眼发现有更改其值的需要的时候,全部使用const来标注,
很方便的说....Top
19 楼colcn88((散花)只想让家里人过得更好)回复于 2006-07-03 23:24:48 得分 0
林瑞就是误人子弟
我不知道LZ看他的书为何
呵呵 搞不明白Top
20 楼xwffwx(Don't call me chinese)回复于 2006-07-04 09:49:19 得分 0
1.如果一个语言要程序员用p==NULL的形式来标志那是一个指针,那么这个语言的设计一定是拙劣的。
2.如果语言并不要求程序员用p==NULL的形式来标志那是一个指针,但程序的设计架构却要求,那么这个程序的设计架构一定是拙劣的。
3.如果语言与程序总体设计架构都不要求程序员用p==NULL的形式来标志那是一个指针,但是程序员自己却非要这么做才能容易的识别出指针,那么这个程序员的编程方式就一定是拙劣的。
4.如果语言、程序总体设计架构与程序员自己都不需要用p==NULL的形式来标志那是一个指针,但是还是仍然非要这样做,那简直……
-----------------------------------
如果某种语言就定义NULL为空指针,用p==NULL判断算得上是拙劣?
如果有一种新的操作系统其内存管理的定义-1为无效指针
于是c语言在该系统上将NULL定义为-1
这时if(!p)会出错,而if(p==NULL)是正确的
判断空指针这不是一个逻辑0判断,只是一个常量判断,这个常量就是NULL
之所以你认为这是一个逻辑0判断,仅仅只是你知道在C/C++中NULL定义为0而已
另外ANSI C中函数的返回值定义中都是说NULL表示空指针,而没有说0表示空指针
‘C++之父BS说林锐错了’这个错在那,我很想知道
LZ尚未给我信服的答案
Top




