bool
的隐式转换的类型T
,该转换被定义为a != static_cast<T>(0)
。(唯一的例外是std::nullptr_t
,它总是转换为false
;我甚至不确定static_cast<std::nullptr_t>(0)
是否合法。) - James Kanze *必须*使用减法操作码来实现。甚至它也不要求如果
~E使用按位取反操作码,那么
UINT_MAX - E`也必须使用按位取反操作码以保持两者的等价性。 - Steve Jessop!
需要一个bool
类型的操作数;如果它的操作数是int
类型,则会有一个隐式转换(这对混淆很好,但通常应该避免使用)。按定义,将int a
隐式转换为bool
的方式是a != 0
。因此!a
就是!(a != 0)
。实际上,很难想象任何编译器不会生成与a == 0
完全相同的代码,因此性能肯定不应该是一个考虑因素。说你的意思,做你所说的:既然你在比较0
,那就应该这样写。int
,则!a
的正式定义是!(a != static_cast<T>( 0 )
,其中T
是a
的类型。虽然隐式转换通常会影响可读性,但我认为没有人会坚持将0
显式转换为另一种整数类型。另一方面,我系统地为浮点类型写a == 0.0
,在C++中为指针类型写a == nullptr
——这涉及到另一个隐式转换,从std::nullptr_t
到指针类型。并非所有的隐式转换都是相等的:-)。(FWIW:我接受整数类型之间的隐式转换,以及浮点类型之间的隐式转换,只要它们不是缩小转换,如C++11 §8.5.4/7所定义的那样,除了应该使用'\0'
而不是0
来表示字符数据;以及指针之间的隐式转换,以及指针与std::nullptr_t
之间的隐式转换。整数类型到浮点类型的隐式转换也不会让我感到困扰,尽管我永远不会写它们。但就是这些。)== 0
是正确的。如果检查的目的是确定某个抽象条件未满足(这恰好通过数值来建模),则使用!
。考虑:if(numberOfItems == 0)
和if(!file_handle)
。 - ComicSansMSif ( file_handle != invalid_file_handle )
,其中 invalid_file_handle
是一个定义的常量。虽然有些情况下... 在 Unix 环境中编程的人会觉得 if ( fd < 0 )
很熟悉,例如,不需要为 0
定义一些特殊的符号,如果环境将句柄定义为指针类型(作为公共接口的一部分——很多接口将使用 void*
作为接口中的魔术 cookie),那么 if ( handle != nullptr )
就可以了。 - James Kanzebool
几乎具有相同的行为。但是,语言层面上的正式区别是不同的。 - James Kanzewhile ( std::getline( input, line ) )...
这样的东西,其中包含一些相当可怕的隐式转换,如果你仔细想想的话。但你不会考虑这个问题,因为std::istream
是以这种方式指定的:如果有任何失败,则为false
,否则为true
。 - James Kanzex+y
等价于 y+x
并不能说明任何关于性能的问题。性能保证超出了语言标准的范围。 - P.P我预计对于整数和指针,!a
和 a==0
的计算速度不会有区别。
使用最能清晰表达您意图的变量。对于整数,我总是使用 `a==0'。对于指针,这两个版本都很好。
PS:性能差异不是不可能的,但应该非常小。对于良好的优化编译器来说,差异实际上是不可能的。它将被视为错误并很快得到修复。
0 == a
而不是a == 0
。 !!a
的用处,这也是为什么这个技巧在现代语言版本中无用但在旧代码库中广泛采用的原因。0 == a
而不是a == 0
呢?这样会让读者感到困惑。 - James Kanze==
是对称关系的读者肯定会感到困惑;-) 不直觉理解是很自然的,因为虽然在字面上,“和…一样”是对称的,但在强调方面它却不是对称的。因此,在理解代码时重点强调往往容易让读者感到困扰,特别是当常量出现在左侧时。在不需要强调重点的情况下,它们(据我所知)并不会产生这种影响。 - Steve Jessop0==a
和a==0
在性能和类型转换方面没有任何区别。此外,“在C语言中存在一些细微差别,对于不支持bool类型的C版本,通常会将bool作为整数处理”是毫无意义的。所有版本的C语言都将bool类型视为整数,并且C语言中的所有运算符都会将bool类型提升为整数(C++不同)。在C语言中不存在将任何内容隐式转换为bool类型的转换。 - Lundin我在自己的代码中通常使用!a
,只是因为它更短/更简单(在工作中,编码标准是0 == a
)。
正如其他人所说,编译器会解决任何不同之处,并且两种情况下都会执行某种检查“值是否为零”,并从中形成布尔结果。最终结果应该非常相似。
上述内容假设a
的类型是简单类型(整数/字符/布尔或浮点类型)。如果它恰好是一个类
或结构体
,那么!a
版本将调用operator bool
操作数,而a == 0
可能会使用不同的方法,例如operator==
- 注意这里的规则很复杂,一个对于另一个的影响可以是重大的。
总之,对于简单类型,这只是一种风格问题(在大多数编译器中!)。对于复杂类型,这取决于所涉及的类/结构体的设计。
如果性能真的很重要,请测量不同解决方案之间的差异,并查看哪个在该情况下表现最佳。