C/C++`!a` vs`a == 0`

the*_*man 3 c c++

当我有一个整数或指针时a,事实证明两者都是

!a
Run Code Online (Sandbox Code Playgroud)

a==0
Run Code Online (Sandbox Code Playgroud)

有相同的行为.在非常低的水平上,计算速度方面是否存在一些差异?

Ste*_*sop 9

性能不太可能存在差异,因为编译器知道逻辑等价,因此没有理由不能为两者发出相同的代码.

等价是初级,而不是一些巧妙定理:该含义!a用于在标准中定义的整数类型是"的值a等于0"(或严格地说詹姆斯指出,"不(值a不为0)"),并且!a指针类型的含义是" a是一个空指针"(或严格来说"不是(a非空指针的值)").

但是,并不要求编译器必须为两者发出相同的代码,因此C或C++标准无法保证性能相同.


Jam*_*nze 8

根据定义,!需要类型的操作数bool; 如果它的操作数有一个类型int,那么就有一个隐式转换(这对于混淆是很好的,但通常应该避免).根据定义,诠释的隐式转换aboola != 0.所以!a!(a != 0).在实践中,这是很难想象任何编译器不产生正是为了相同的代码!(a != 0)作为a == 0,所以性能当然不应该是一个考虑因素.说出你的意思,并表达你的意思:既然你要比较0,那就是应该写的方式.

编辑:

正如Steve Jessop指出的那样,如果被比较的类型不是 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,字符数据;以及指针之间以及指针和a之间的 std::nullptr_t隐式转换.整数类型到浮点类型的隐式转换也不会打扰我,尽管我从不写它们.但这就是它.)

  • +1表示_say你的意思_:如果检查的目的是确定数值是否等于0,那么`== 0`是正确的.如果检查的目的是确定某些抽象条件未实现(恰好通过数值建模),请使用`!`.考虑:`if(numberOfItems == 0)`和`if(!file_handle)`. (3认同)
  • @ComicSansMS是的.语境就是一切.在发表我的评论之后,我立刻想到我总是坚持使用诸如`while(std :: getline(input,line))......之类的东西,其中包含一些非常可怕的隐式转换,如果您认为关于它.但你没有考虑它,因为`std :: istream`是以这种方式指定的:如果有任何失败则为'false`,否则为true. (2认同)