JAVA: В чем разница между логическим И/ИЛИ и коротким замыканием И/ИЛИ?

Когда я запускаю простую программу, обе они ( & и && ), похоже, работают взаимозаменяемо. Может ли кто-нибудь объяснить, когда я должен использовать каждый случай?

 public class Test1 {

    public static void main(String [] args){

        int counter = 0;

        int dice1;
        int dice2;


    for (int loop = 0; loop <= 1000; loop++) {


    dice1= (int) (Math.random()*6)+1;
    dice2= (int) (Math.random()*6)+1;

        if (dice1 == 6 && dice2 == 6){
            counter ++;
        }

    }

    System.out.println("Counter = " + counter);

    } 
}

Эта программа также работает, когда я использую & вместо &&. Так какая разница?


person TheHoboMaster    schedule 29.04.2016    source источник
comment
Я не вижу использования || или | в вашем коде. Не могли бы вы поделиться своим фактическим кодом, пожалуйста?   -  person Mureinik    schedule 29.04.2016
comment
я имел в виду & и &&, мой плохой   -  person TheHoboMaster    schedule 29.04.2016
comment
Вы знаете, что в одном из них произошло короткое замыкание. Вы понимаете, что это значит? Что делать, если ваш тест test != null && test.equals("foo")? Проверьте это.   -  person JB Nizet    schedule 29.04.2016
comment
На вопрос, указанный @JBNizet, есть принятый ответ, который неверен. Поскольку я больше не могу ответить на этот вопрос, я не могу полностью объяснить разницу. Достаточно сказать, что одиночный оператор & является побитовым, а && — логическим и. Также оператор if оценивает только логические операции. Каждая часть if оценивается как логическое значение. Затем, если вы побитовое и логическое значение с другим логическим значением, вы получите логический результат. Таким образом, в этом случае вы получите тот же результат. Но логические вычисления могут закорачиваться, а побитовые выражения — нет.   -  person markbernard    schedule 29.04.2016


Ответы (1)


Основное отличие состоит в том, что операторы && и || выполняют некоторую «ленивую оценку».

В этой строке кода:

method1() & method2();

оба метода будут вызываться независимо от возвращаемого значения method1. С другой стороны, в этой строке кода:

method1() && method2();

method2 будет вызываться только в том случае, если method1 возвращает true.

При использовании || второй метод будет вызываться только тогда, когда первый метод вернет false.


person ParkerHalo    schedule 29.04.2016