为什么Mozilla开发者指南更喜欢if(ptr)而不是if(ptr!=nsnull)

Why does the Mozilla Developer Guide prefer if (ptr) over if (ptr != nsnull)?

本文关键字:ptr if nsnull Mozilla 更喜欢 为什么 开发者      更新时间:2023-10-16

在Mozilla开发者风格指南中,在C/C++实践下,可以找到

测试指针时,请使用(!myPtr)或(myPtr;不要使用myPtr!=nsnull或myPtr==nsnull。

这背后有原因吗?还是只是一个惯例?

一般来说,公司编码准则就是期望在公司内部执行的准则。

这是一个偏好问题——它们都实现了相同的事情(假设myPtr是指针*),所以这纯粹是主观的。对于一个大的代码库,在一半的地方看到if (myPtr),在另一半看到if (myPtr != NULL),这很烦人。

*如果myPtr是非指针用户定义类型,它可能会重载运算符!!===,因此它们实际上的行为可能不同

如果你做了这个,就有可能犯下很难找到的印刷错误

if (myPtr = nsnull) /* assignment operator */

而你真正的意思是这个

if (myPtr == nsnull) /* test equality */

这背后有原因吗?

公司编码准则的存在是因为,在一家大公司中,通常会有人将美学一致性置于其他编程问题之上。他们将生成大量毫无意义的指导方针,比如这一条,并虚假地证明无关细节的一致性使代码更具可读性。如果企业环境功能失调,这些指导方针将被写入官方政策文件,并强加给所有开发商。

或者这只是一个惯例?

在这种情况下,最好不要使用一些非常规符号,这些符号可能会也可能不会计算为空指针值;尽管据推测nsnull是由本风格指南定义和强制使用的,因此其含义对内部人士来说是清楚的。if (ptr)是否比更传统的if (ptr != 0)(或NULLnullptr)更好是一个品味问题:有些人会为自己的选择进行圣战,有些人则不在乎。

您的风格指南推荐的风格有一个名称:boolean zen。这是布尔表达式的本质。练习布尔禅意味着用最简单的形式编写布尔表达式。例如,这不是布尔型zen:

bool foo() {
if(myCondition()) {
return true;
} else {
return false;
}
}

用布尔禅宗重写,你会得到这个:

bool foo() {
return myCondition();
}

我相信很容易看出第二个更可取,因为它没有添加不必要的代码结构。

现在,在C导数中,如果在布尔上下文中使用,每个整数/指针也有一个定义的行为。手工转换是没有意义的。例如,在C/C++/Objective-C中的if语句

bool foo = ...;
if(foo) printf("It's true");
if(foo != false) printf("It's really true");

等同于

Bar* foo = ...;
if(foo) printf("It exists");
if(foo != 0) printf("It really exists");

因此,根据boolean zen,在任何一种情况下,您都应该坚持使用更简单的方法。


您可以在本幻灯片组中找到布尔禅的介绍。