C++ C++;在特定条件下依赖于到布尔的隐式转换?

C++ C++;在特定条件下依赖于到布尔的隐式转换?,c++,coding-style,implicit-conversion,C++,Coding Style,Implicit Conversion,我在a中发现了以下规则: 在条件下,不要依赖于到bool的隐式转换 if(ptr)//错误 如果(ptr!=NULL)//确定 这条规则有多合理/有用? 编译后的代码有多少过载?这根本不会影响编译后的代码 至于它有多有用,它肯定会帮助来自Java/C等语言的人理解。这会让你更清楚地知道你在检查什么。如果您开始将int与NULL进行比较,它将抛出一条警告(从而表明您对所讨论的变量类型不清楚)。我个人更喜欢第一种形式,但这并不是一个完全不合理的要求。在大多数情况下,这并不可怕,但如果您键入的是您想要

我在a中发现了以下规则:

在条件下,不要依赖于到bool的隐式转换

if(ptr)//错误

如果(ptr!=NULL)//确定

这条规则有多合理/有用?


编译后的代码有多少过载?

这根本不会影响编译后的代码


至于它有多有用,它肯定会帮助来自Java/C等语言的人理解。这会让你更清楚地知道你在检查什么。如果您开始将int与NULL进行比较,它将抛出一条警告(从而表明您对所讨论的变量类型不清楚)。我个人更喜欢第一种形式,但这并不是一个完全不合理的要求。

在大多数情况下,这并不可怕,但如果您键入的是您想要的内容,它的可读性会更高。

有时我认为这条规则可能会被打破,例如在处理返回
int
而不是
bool
的标准库时(与C89兼容)


然而,这条规则通常会使代码更容易理解。它甚至在C#等语言中也得到了实施,而且没有太多的抱怨,因此遵循这条规则除了必须习惯之外没有什么大的缺点。

一条零效益的规则是一条你可以删除的规则。

从严格意义上讲,您可以依赖到bool的隐式转换。向后兼容C需要它


因此,这就成了一个代码可读性的问题。代码标准的目的通常是强制执行代码样式的相同性,无论您是否同意该样式。如果您正在查看其他人的标准,并想知道是否应该将其纳入您自己的标准,请继续讨论,但如果这是您公司的长期规则,请参阅le我很不喜欢这个规则。C++中的习惯用法是将隐式转换用于指针类型(当然也适用于布尔类型)。IMO,更容易阅读< /P>
bool conditionMet = false;

while (!conditionMet) // read as "while condition is not met"
{
    /* do something */
}
而不是读这个:

bool conditionMet = false;

while (conditionMet == false) // read as "while conditionMet is false"
{
    /* do something */
}

指针也是一样。另外,通过引入不必要的比较,您又引入了一个错误输入的机会,并以赋值而不是比较结束,这当然会产生不希望的结果。在使用int作为布尔的情况下,就像使用旧的C代码一样,我认为您还应该使用隐式conversion到bool。

如果您想要使用具有到
bool
的隐式转换的类,例如
std::istream
,则该规则将使您处于绑定状态。此代码每次从文件读取一个字,直到达到EOF为止:

std::ifstream file("foo.txt");
std::string word;

while (file >> word)
{
    // do stuff
}
stream extraction操作符返回对文件流的引用,该引用隐式转换为
bool
,以指示流是否仍处于良好状态。当到达文件末尾时,测试失败。您的编码标准禁止您使用此通用构造

对于指针类型来说,这没什么大不了的。编译器可能会为
bool
的隐式转换和针对
NULL
的显式测试生成大约相同的代码。这是一个品味问题——两者都不是“更好的”从绝对意义上讲,编码标准只是试图实现一致的风格


考虑到这一点,在处理内置类型(指针、int等)时,您应该绝对遵循编码标准。如果您遇到与上述类似的情况,并且一个类合法地转换为
bool
,我会向您的队友提出这个问题。

这是一个非常愚蠢的规则

if (ptr != NULL) // ok
那为什么不呢

 if ((ptr != NULL)==true) 

我想为这个问题添加一个历史观点

(又名C89/C90)是C的第一个正式规范。除此之外,您可能会注意到一些奇怪的事情,即没有布尔值的概念。控制流语句对表达式进行操作,它们的流是根据表达式的计算结果是否为0来定义的。缺少布尔值类型是C最大的疏忽之一。直到C99,C获得了<代码>布尔布尔< /COD>类型,并定义了<代码> BoOL ,<代码>真< /COD>,和<代码> false (注:它们仍然是整数)。同样,C++最初也没有布尔类型,也可以用<代码> BoOL < /C> >获得。 这就是为什么会有到布尔值的隐式转换。在我看来,继续依赖于这一点是不好的设计,布尔值的添加是有原因的。
true
应该始终等于
true
,并且将所有非零值隐式转换为true是不令人满意的

NULL
也只是一个等于零的宏,因此特别是对于C++11中的指针,应该使用
nullptr
来确定指针是否为NULL

if(ptr != nullptr)
{
    // Do something with ptr.
}

我无法立即找到引用,但我不认为您所说的是正确的。我认为标准将NULL定义为等同于零。无论哪种方式,我都无法命名一个不是这种情况的系统…NULL为0(直到强制转换)在所有符合远程标准的系统上。一些深奥的实现可能会将指针0编译为0以外的其他对象,但在代码中它仍然是0。我仍然没有为您提供链接,但来自我的K&R副本的第102页:指针和整数是不可互换的。零是唯一的例外:常数零可以分配给指针,指针可以与常数零进行比较。符号常数NULL通常用来代替零,作为助记符,以更清楚地表明这是指针的特殊值。“所以NULL在所有系统上都应该等于零。我想纠正一下,该语言掩盖了这个实现细节。也就是说,并非所有系统都在内部使用0,但大多数系统都使用0,因为它通过导致内存错误来强制执行NULL解引用错误。标准说“宏NULL是一个实现