有时候,我看到了以下代码:
if ( !!on_debugging )
与
相同if ( on_debugging )
我不明白为什么使用这两个。有什么区别吗?
答案 0 :(得分:7)
!!a
几乎相当于a
。它将其转换为布尔值。
通常情况下这并没有什么不同,但有时会有所不同。
#include <iostream>
int a(int x) {
return 1;
}
int a(bool x) {
return 2;
}
int main() {
std::cout << a(0) << std::endl; //prints 1
std::cout << a(!!0) << std::endl; //prints 2
std::cout << -1 << std::endl; //prints -1
std::cout << !!-1 << std::endl; //prints 1
}
在您的情况下,除非存在超载,否则没有区别。 (但即使有超载,我希望没有区别。)
(仅供参考,这在Javascript中更常见,因为其类型,例如false != null
但false == !!null
。我包含此注释,因为您使用C,C ++和Java标记了您的问题,以及Javascript共享类似的语法。)
答案 1 :(得分:2)
如果operator!
未重载,则这两个语句是等效的。
!!
可能有用的地方是,您需要将零/非零值或nullptr
/非空指针值更改为整数表达式中的0/1值。
对于(可疑的)示例,以下循环计算向量中非零元素的数量:
for (size_t i = 0; i != v.size(); i++)
count += !!v[i];
您有时会在位级黑客中看到!!
。但是在上面显示的if
声明中?除非operator!
超载,否则这不是一个有用的操作。
答案 2 :(得分:0)
必须某种形式的运算符重载,否则意味着相同。
答案 3 :(得分:0)
将此作为live示例:
#include <stdio.h>
int main(void) {
int a = 5;
printf("%d\n", a);
printf("%d\n", !!a); // will print 1
return 0;
}
答案 4 :(得分:0)
主要区别在于Visual C ++的愚蠢警告。
次要(罕见)差异包括您有operator!
的情况,以及在非布尔上下文中使用参数的情况,例如:算术。
答案 5 :(得分:0)
双倍!简单地表示一个一元的NOT和另一个一元的不是。将其视为(!(!on_debugging))
是的,你是对的,大多数时候结果与on_debugging
相同。我认为这是为了使用!!
的准确性或严格性,因为!
运算符仅返回integer 0 or 1
,其对应于false
和true
。变量可以是int
和point
类型的任何内容。
答案 6 :(得分:-1)
For Java !!on_debugging
与!!!on_debugging
相反。
您可以根据需要经常否定内容,因此on_debugging
和!!on_debugging
之间没有区别。
另请参阅此运算符的Java语言规范:
一元的操作数表达式的类型!运营商必须 布尔值或布尔值,或发生编译时错误。 (see JLS 15.15.6)。