Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > if(false && true &&...)


Автор: Antropoid 22.3.2007, 12:38
Код

bol1 = false;
bol2 = true;

if(bol1 && bol2 && ...) 
   ...

Компилятор будет проверять второе условие, или, поймет, что далее идти бессмысленно?

Автор: batigoal 22.3.2007, 12:54
Поймет.

Только не компилятор, а среда выполнения. При компиляции, думаю, это не будет оптимизировано.

Автор: LSD 22.3.2007, 13:16
Если переменные объявить как final, то компилятор сразу вычислит выражение и уберет условие совсем.

Автор: Antropoid 22.3.2007, 13:18
ОК. Спасибо.

Автор: _Y_ 22.3.2007, 14:07
Если не ошибаюсь, в общем случае & проверяет все условия выражения, а только потом решает что делать. && же, найдя первое значение false (идя слева направо если нет скобок), забросит это дело, справедливо решив, что далнейшие траты времени бессмысленны и результат все равно false. Это позволяет оптимальнее писать код, ставя на первое место ту операцию, которая вероятнее даст false. Подобная разница есть и в выполнении других булевых операторов. 

Автор: nornad 22.3.2007, 16:02
Цитата(_Y_ @  22.3.2007,  17:07 Найти цитируемый пост)
Если не ошибаюсь

Как раз ошибаешься. В общем случае используется ленивое вычисление и если после первого условия уже можно точно скачать, каким будет результат всего выражения, то второе условие вычисляться не будет.
Насчёт final не в курсе.

Добавлено @ 16:05 
Упс, что-то я уже не всё понимаю при чтении. smile
Да, насчёт поведения & и && ты всё описал верно.

Автор: VSergeyV 22.3.2007, 16:09
Код

b = false;
if (b.toString().length < 5){...}

гыгыгыг, говорят из индийского кода smile 

да поспешил /*но смысл то остался*/ smile 

Код

public class test {
       public static void main(String[] args){
        boolean b = true;
        if (Boolean.toString(b).length() < 5) System.out.println("1");
           else  System.out.println("2");
       }
}


Автор: LSD 22.3.2007, 17:18
Цитата(VSergeyV @ 22.3.2007,  16:09)
Код

b = false;
if (b.toString().length < 5){...}

гыгыгыг, говорят из индийского кода smile

Это с The Daily WTF, и код изначально на C# (на Java такое не скомпилируется).

Автор: _Y_ 22.3.2007, 17:35
Цитата(nornad @ 22.3.2007,  16:02)
Цитата(_Y_ @  22.3.2007,  17:07 Найти цитируемый пост)
Если не ошибаюсь

Как раз ошибаешься. В общем случае используется ленивое вычисление...

Заело. Нашел книжку D.Flanagan, Java in a Nutshell
Цитата

Conditional AND (&&)
....it conditionaly evaluates its second operand. If the first operand evaluates to false, ... skips the second operand.
......
Boolean AND (&)
...behaves like && operator, except that it always evaluates both operands....

Удивительно, но я оказался прав smile 

ЗЫ: Видимо я непонятно использовал слова "в общем случае". Я подразумевал случай "без final". Прошу прощения. 

===========
Отправил и увидел изменение в Вашем посте.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)