按位运算符应该传输变量并逐位操作它们.在整数,longs,chars的情况下这是有道理的.这些变量可以包含由其大小强制执行的所有值.
但是,在布尔值的情况下,布尔值只能包含两个值.1 =真或0 =假.但是没有定义布尔值的大小.它可以大到一个字节或一点点.
那么在布尔值上使用按位运算符会产生什么影响呢?JVM本质上是将它转换为普通的逻辑运算符并继续前进吗?为了操作的目的,它是否将布尔值视为单个位实体?或者结果未定义以及布尔值的大小?
你什么时候需要使用非短路逻辑运算符?换一种说法...
你什么时候用
if(x == 1 | x==2)
Run Code Online (Sandbox Code Playgroud)
代替
if(x == 1 || x==2)
Run Code Online (Sandbox Code Playgroud)
如果第一个条件为真...则整个语句已经为真.
更新:和&和&&的相同问题
来自文档:http://ruby-doc.org/core-2.2.0/TrueClass.html#method-i-7C
true | puts("or")
true || puts("logical or")
# produces:
or
Run Code Online (Sandbox Code Playgroud)
(仅在TrueClass上下文中(不是Array或Fixnum上下文)
这直接受到这个问题的启发.
有许多引用/声明,当应用于布尔运算符时,按位运算符不会短路.换句话说boolean a = f() & g(),where f()和g()both都返回boolean,两者都将被评估.
但是,JLS只说:
15.22.2布尔逻辑运算符&,^和|
当两个操作数都是&,^或|时 operator的类型为boolean或Boolean,则按位运算符表达式的类型为boolean.在所有情况下,操作数都根据需要进行拆箱转换(第5.1.8节).对于&,如果两个操作数值都为真,则结果值为true; 否则,结果是错误的.
对于^,如果操作数值不同,则结果值为true; 否则,结果是错误的.
对于|,如果两个操作数值都为false,则结果值为false; 否则,结果是真的.
这如何保证两个操作数都被实际评估?除此之外xor,如果其中一个参数(可能是第二个/右边首先被评估)违反条件,您仍然可以中断并返回结果.
例如.a & b只需要评估b为false就可以将表达式计算为false.
请注意:我不是问它是否以这种方式实现(不会短路) - 当然是.
我在问:
短路实施会违反语言标准吗?
我理解下面的差异(至少对于Java):
if( true || false ) // short-circuiting boolean operator
if( true | false ) // non-short-circuiting boolean operator
Run Code Online (Sandbox Code Playgroud)
但我的问题是,在处理布尔表达式时,有没有理由使用非短路运算符?是否有某些性能优势或使用不被视为不良做法?
自从我开始编写Java以来,我注意到每个人都在使用&&而||不是&和|.这是什么原因?我一直在使用&&,||因为我不知道你可以使用&和|布尔.
class A{static{
boolean t = true;
boolean f = false;
System.out.println("&ff " + (f&&f) + " " + (f&f));
System.out.println("&ft " + (f&&t) + " " + (f&t));
System.out.println("&tf " + (t&&f) + " " + (t&f));
System.out.println("&tt " + (t&&t) + " " + (t&t));
System.out.println("|ff " + (f||f) + " " + (f|f));
System.out.println("|ft " + (f||t) + " " + …Run Code Online (Sandbox Code Playgroud) java boolean bit-manipulation operators conditional-statements
我只是好奇.我想知道表达式是否有特定原因
var &= expr
Run Code Online (Sandbox Code Playgroud)
表现不一样
var = var && expr.
Run Code Online (Sandbox Code Playgroud)
看起来第一个中的表达式正在执行,而不管var上的错误值.
我正在使用Java 6,FYI.这段代码:
public class Test
{
protected static String getString()
{
return null;
}
public static void main(String... args)
{
String string = getString();
boolean test = (string != null);
test = test && (string.length() > 0);
System.out.println("First test passed");
test &= (string.length() > 0);
System.out.println("Second test passed");
}
}
Run Code Online (Sandbox Code Playgroud)
给我:
First test passed
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at …Run Code Online (Sandbox Code Playgroud) 首先,我了解到&,|,^是位运算符,现在有人提到他们与逻辑运算符&&,||,我完全糊涂了-同一个运营商有两个名字?已经有逻辑运算符&&,||,那么为什么使用&,|,^?