
„Здрасти, Амиго!“
„Сега ще имаме малък урок за логическите оператори.“
„Какви логически оператори знаете?“
— ИЛИ (||), И (&&), НЕ(!)
"Да. Добра работа. И помниш ли How работят?"
— Да.
"ИЛИ дава вярно, когато поне един операнд е верен."
"И дава истина, когато и двата операнда са верни."
"NOT променя true на false и false на true."
„Точно така. И в Howъв ред се оценяват операторите в този израз?“
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = a && b || !c && b || !a;
— Всичко това е много просто.
„Първо НЕ (!), след това И (&&) и след това ИЛИ (||) в самия край.“
Ако добавим скоби, ще получим:
boolean a = true;
boolean b = false;
boolean c = true;
boolean result = (a && b) || ((!c) && b) || (!a);
„Всичко е правилно, браво. И Howъв е резултатът?“
— 1) (a && b) == (вярно && невярно) == невярно
2) ((!c) && b) == (false && false) == false
3) (!a) == невярно
4) невярно || невярно || невярно == невярно
"Резултатът е фалшив."
"Изглежда, че познавате темата перфектно. Тогава ще ви кажа няколко малки тайни."
„Първо, логическите изрази се оценяват отляво надясно.“
„Второ, тук се използва оценка на късо съединение (изчисленията се извършват само ако е необходимо). Ако крайният резултат вече е известен от оценяването на част от израза, тогава останалата част от израза не се оценява.“
boolean result = (true && false) || (true && true) || (true && false);
„Този израз е разделен на три части, разделени от оператора ИЛИ (||).“
„Ако поне една част е вярна, тогава отговорът е верен и нищо друго не трябва да се взема предвид. Съответно изразът се оценява по следния начин:“
1) Оценете първата част: (true && false) == false
2) Оценете втората част: (true && true) == true
3) Не оценяваме третата част, тъй като вече е ясно, че отговорът ще бъде верен .
„Този подход се нарича още мързелива оценка.“
"Добре. И Howво му е толкова специално?"
"Нищо - докато не започнете да извиквате методи вътре в израза. Ако част от израза е пропусната, тогава методите в пропуснатата част няма да бъдат извикани."
„Но този подход стана много често срещан. Ето защо:“
Job job = null;
if (job != null && job.isDone())
{
…
}
"Ако заданието е нула, когато изразът се оценява, тогава извикването на job.isDone() няма да се случи!"
„Наистина, първата част от израза е невярна, която е последвана от И (&&). Така че целият израз ще бъде известен като невярна и втората част няма да е необходима.“
"Точно така. Това е добра техника, нали?"
— Да.
GO TO FULL VERSION