相关疑难解决方法(0)

按位运算符对Java中布尔值的影响

按位运算符应该传输变量并逐位操作它们.在整数,longs,chars的情况下这是有道理的.这些变量可以包含由其大小强制执行的所有值.

但是,在布尔值的情况下,布尔值只能包含两个值.1 =真或0 =假.但是没有定义布尔值的大小.它可以大到一个字节或一点点.

那么在布尔值上使用按位运算符会产生什么影响呢?JVM本质上是将它转换为普通的逻辑运算符并继续前进吗?为了操作的目的,它是否将布尔值视为单个位实体?或者结果未定义以及布尔值的大小?

java boolean bitwise-operators

109
推荐指数
3
解决办法
5万
查看次数

逻辑运算符OR无短路

你什么时候需要使用非短路逻辑运算符?换一种说法...

你什么时候用

if(x == 1 | x==2)
Run Code Online (Sandbox Code Playgroud)

代替

if(x == 1 || x==2)
Run Code Online (Sandbox Code Playgroud)

如果第一个条件为真...则整个语句已经为真.

更新:和&和&&的相同问题

java

7
推荐指数
1
解决办法
196
查看次数

Ruby TrueClass单管道

来自文档: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上下文中(不是ArrayFixnum上下文)

ruby

7
推荐指数
2
解决办法
3175
查看次数

什么(在规范中)保证'非短路逻辑运算符实际上不会短路?

这直接受到这个问题的启发.
有许多引用/声明,当应用于布尔运算符时,按位运算符不会短路.换句话说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 short-circuiting jls

6
推荐指数
1
解决办法
161
查看次数

短路与非短路运营商

我理解下面的差异(至少对于Java):

if( true || false ) // short-circuiting boolean operator
if( true | false )  // non-short-circuiting boolean operator
Run Code Online (Sandbox Code Playgroud)

但我的问题是,在处理布尔表达式时,有没有理由使用非短路运算符?是否有某些性能优势或使用不被视为不良做法?

java

6
推荐指数
5
解决办法
3782
查看次数

我为什么要经常使用|| 而不是| 和&&代替&?

自从我开始编写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

5
推荐指数
2
解决办法
2076
查看次数

"var&= expr"的行为不像"var = var && expr"

我只是好奇.我想知道表达式是否有特定原因

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)

java compilation

4
推荐指数
1
解决办法
231
查看次数

是&,|,^位运算符还是逻辑运算符?

首先,我了解到&,|,^是位运算符,现在有人提到他们与逻辑运算符&&,||,我完全糊涂了-同一个运营商有两个名字?已经有逻辑运算符&&,||,那么为什么使用&,|,^

java operators

3
推荐指数
1
解决办法
3026
查看次数