Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 两者之间有什么区别!!什么都没有?_Java_C++_C - Fatal编程技术网

Java 两者之间有什么区别!!什么都没有?

Java 两者之间有什么区别!!什么都没有?,java,c++,c,Java,C++,C,有时,我会看到以下代码: if ( !!on_debugging ) 这和 if ( on_debugging ) 我不明白为什么这两个!使用的是一种新方法。有什么区别吗?如果运算符没有重载,这两条语句是等效的 其中可能很有用 对于一个(可疑)示例,以下循环计算向量中非零元素的数量: for (size_t i = 0; i != v.size(); i++) count += !!v[i]; 您有时会看到位级黑客攻击。但是在上面显示的if语句中?除非操作员被重载,这不是一个

有时,我会看到以下代码:

if ( !!on_debugging ) 
这和

if ( on_debugging )

我不明白为什么这两个!使用的是一种新方法。有什么区别吗?

如果
运算符
没有重载,这两条语句是等效的

其中
nullptr
/non-null指针值更改为0/1值,则code>可能很有用

对于一个(可疑)示例,以下循环计算向量中非零元素的数量:

for (size_t i = 0; i != v.size(); i++)  
    count += !!v[i];

您有时会看到
位级黑客攻击。但是在上面显示的
if
语句中?除非
操作员
被重载,这不是一个有用的操作。

必须有某种形式的运算符重载,否则,它的意思相同。

!!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

}
#包括
整数a(整数x){
返回1;
}
整数a(布尔x){
返回2;
}
int main(){
std::cout以此为例:

#包括
内部主(空){
INTA=5;
printf(“%d\n”,a);
printf(“%d\n”,!!a);//将打印1
返回0;
}

> > p>主要区别是VisualC++中的愚蠢警告。


次要(罕见)差异包括有
运算符!
的情况,以及参数用于非布尔上下文(例如算术)的情况。

Double!简单地说是一元NOT和另一元NOT。将其视为
(!(!on_调试))


是的,你是对的,大多数情况下,结果与调试时的
相同。我认为这是为了使用
!!
的精确性或严格性,因为
操作符只返回
整数0或1
,这对应于
。而变量可以是
I中的任何一个nt
类型。

用于Java
!!on_调试
!!!on_调试
相反

您可以根据需要随时否定内容,因此在调试时
和调试时
之间没有区别

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

一元运算符的操作数表达式的类型必须为 布尔值或布尔值,或发生编译时错误。 ()


我唯一想到的是操作符!可能是重载的。在这种情况下,它不是。如果它是非布尔,它将是0或1,但这在这里是没有意义的。如果它是(比如)一个整数,第一个
将把任何正值转换为零,第二个将把零转换为一。这在某些情况下很有用。但是,在这里,两者在语义上没有区别。-1因为..请选择一种语言。这种语言的有效性因语言(和声明的类型)而异结果可能有特定于语言的含义。
实际上不返回布尔值。它只返回
int
0或1。@richard.g,我不同意。在我的示例中,
a(!0)<代码> >代码< 2 > <代码>,因为<代码> 0代码>代码< BoOL 类型。返回类型<代码> <代码>在C和C++中是不同的。C中是<代码> int <代码>(值<代码> 0 <代码>或<代码> 1 < /代码>)在C++中,这是一个<代码>布尔O/COD>。这个问题是针对两种语言的。@ PaulDraper,对不起,我没有很好地看你的例子。我在C和C中检查了它,它返回int。你是正确的C++场景。是的,在C的情况下,<代码> <代码>返回<代码> int <代码>,其值是代码> 0 < /代码>或<代码> 1 < /C>。
#include <stdio.h>

int main(void) {
  int a = 5;

  printf("%d\n", a);
  printf("%d\n", !!a); // will print 1

  return 0;
}