2013-03-08 3 views
4

Мне просто интересно. Я хотел бы знать, если есть конкретная причина, почему выражение«var & = expr» не ведет себя как «var = var && expr»

var &= expr 

не ведет себя так же, как

var = var && expr. 

Похоже, что выражение в первой в настоящее время выполняется независимо от false значение 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

Реф. http://stackoverflow.com/questions/7101992/why-do-wually-use-not-what-is-the-difference, http://stackoverflow.com/questions/9264897/reason-for-the- exsistance-of-non-short-circuit-logical-operator, http://stackoverflow.com/questions/4014535/vs-and-vs – 2013-03-08 22:48:46

ответ

10

& не ведет себя как &&1,2

& является нетерпеливый побитовое/логическое_выражение И.

&& является short-circuiting логическим-и.


Линия с &= эквивалентно test = test & (string.length() > 0), который также потерпит неудачу.

См Why do we usually use `||` not `|`, what is the difference? - ответы также охватывают использование && и &.

2

Они не то же самое, потому что & является оператором побитовое и && является логическим оператором на булевы.

var &= expr эквивалентен var = var & expr, а не var = var && expr.

3

Похоже, что выражение в первом выполняется независимо от ложного значения в var.

Это потому, что второе выражение использует оценку короткого замыкания, в то время как в первом выражении нет.

-1

& является побитовое И

&& это логическое И.

true && true = true ..

& работы по номерам, && работает на логических выражений.

0xFE & 0xFF Результаты 0xFE.

+0

& работает также с булевыми – MrBackend

-1
var &= expr 

эквивалентно

var = var & expr 

Другими словами, это делает побитовое или

var = var && expr 

делает логическое или из вар и ехрг

+0

Хотя ответ правильный, вы по-прежнему не понимаете смысла короткое замыкание. & отлично работает с булевыми элементами. – MrBackend

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