有什么区别!!没别的了?

时间:2013-12-12 07:07:04

标签: java c++ c

有时候,我看到了以下代码:

if ( !!on_debugging ) 

相同
if ( on_debugging )

我不明白为什么使用这两个。有什么区别吗?

7 个答案:

答案 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 != nullfalse == !!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,其对应于falsetrue。变量可以是intpoint类型的任何内容。

答案 6 :(得分:-1)

For Java !!on_debugging!!!on_debugging相反。

您可以根据需要经常否定内容,因此on_debugging!!on_debugging之间没有区别。

另请参阅此运算符的Java语言规范:

  

一元的操作数表达式的类型!运营商必须   布尔值或布尔值,或发生编译时错误。   (see JLS 15.15.6)。