为什么Mozilla开发者指南更喜欢if(ptr)而不是if(ptr!=nsnull)
Why does the Mozilla Developer Guide prefer if (ptr) over if (ptr != nsnull)?
在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)
(或NULL
或nullptr
)更好是一个品味问题:有些人会为自己的选择进行圣战,有些人则不在乎。
您的风格指南推荐的风格有一个名称: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,在任何一种情况下,您都应该坚持使用更简单的方法。
您可以在本幻灯片组中找到布尔禅的介绍。
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- CLANG 编译器 说:变量"PTR"可能未初始化
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Mozilla开发者指南更喜欢if(ptr)而不是if(ptr!=nsnull)