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;
}