当我有一个整数或指针时a,事实证明两者都是
!a
Run Code Online (Sandbox Code Playgroud)
和
a==0
Run Code Online (Sandbox Code Playgroud)
有相同的行为.在非常低的水平上,计算速度方面是否存在一些差异?
性能不太可能存在差异,因为编译器知道逻辑等价,因此没有理由不能为两者发出相同的代码.
等价是初级,而不是一些巧妙定理:该含义的!a用于在标准中定义的整数类型是"的值a等于0"(或严格地说詹姆斯指出,"不(值a不为0)"),并且!a指针类型的含义是" a是一个空指针"(或严格来说"不是(a非空指针的值)").
但是,并不要求编译器必须为两者发出相同的代码,因此C或C++标准无法保证性能相同.
根据定义,!需要类型的操作数bool; 如果它的操作数有一个类型int,那么就有一个隐式转换(这对于混淆是很好的,但通常应该避免).根据定义,诠释的隐式转换a
到bool是a != 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隐式转换.整数类型到浮点类型的隐式转换也不会打扰我,尽管我从不写它们.但这就是它.)