2013-03-08 62 views
4

我只是好奇。我想知道是否有一个具体原因 “var&= expr”的行为不像“var = var && expr”

不行为的方式

var = var && expr. 

看起来好像是第一个表达同样被不管执行的表达

var &= expr 
对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"); 
    } 
} 

给我:

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 java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
+1

Ref。 http://stackoverflow.com/questions/7101992/why-do-we-usually-use-not-what-is-the-difference,http://stackoverflow.com/questions/9264897/reason-for-the- exsistance-的,非短路逻辑运算符,http://stackoverflow.com/questions/4014535/vs-and-vs – 2013-03-08 22:48:46

回答

2

他们是不一样的,因为&是位运算符和&&是针对布尔逻辑运算符。

var &= expr相当于var = var & expr而不是var = var && expr

3

它看起来像第一个表达式正在执行,无论var上的值是否为假。

这是因为第二个表达式使用短路评估,而第一个表达式不使用短路评估。

-1

&是按位与

&&是逻辑AND。

true && true = true ..

&作品上的数字,&&作品的布尔表达式。

0xFE & 0xFF结果在0xFE

+0

和工作在布尔太 – MrBackend 2014-02-26 18:59:50

-1
var &= expr 

相当于

var = var & expr 

换句话说,它做了按位

var = var && expr 

做逻辑或VAR和EXPR

+0

虽然答案是正确的,你还在怀念的点短路。与布尔运算符合得很好。 – MrBackend 2014-02-26 19:01:11

0

你的情况

test = test && (string.length() > 0); // test = false that why strings.length not evaluated 

test &= (string.length() > 0); //calling length on null object that why NPE