Он называется Оценка короткого замыкания и означает, что оператор останавливает оценку, как только определяется результат. Части выражения, содержащие операторы &&
или ||
, оцениваются только до тех пор, пока не станет известно, является ли условие истинным или ложным. Это ускоряет выполнение вычисления выражения.
Итак, в вашем коде true || addOne() && addOne() && addOne()
, как известно, будет true
, как только вы найдете true
в своем выражении. В общем случае true || whatever
всегда будет верным, поэтому нет необходимости оценивать whatever
.
&&
имеет приоритет над ||
, поэтому:
true || addOne() && addOne() && addOne()
эквивалентно:
true || (addOne() && addOne() && addOne())
И мы уже знаем, что true
ИЛИ whatever
истинно, поэтому whatever
не будет оцениваться.
Чтобы изменить приоритет в выражении по умолчанию, используйте круглые скобки там, где считаете нужным. Например:
(true || addOne()) && (addOne() && addOne())
В этом случае первое addOne()
не будет оцениваться, но второе и третье будут, поскольку true
И something
равно something
. И, таким образом, в этом случае x будет равно 2 (при условии, что изначально x = 0).
Вот последний пример (я полагаю, вы уже получили его, если не дадите мне знать в комментариях):
if (true || addOne() && addOne()) && addOne()
В этом случае между true
и addOne() && addOne()
существует ИЛИ . Без оценки addOne() && addOne()
мы уже знаем, что true || addOne() && addOne()
- это true
. Таким образом, выражение можно упростить до true && addOne()
. Здесь мы должны оценить addOne()
, что означает, что x
будет равно 1
.
Редактировать
Операторы Swift принадлежат Группам прецедентов (или уровням), которые используются для определения того, какая операция имеет больший приоритет при оценке выражения. Более высокий уровень приоритета означает больший приоритет.
Логическое И &&
принадлежит группе LogicalConjunctionPrecedence , которая имеет более высокий приоритет, чем группа LogicalDisjunctionPrecedence , к которой принадлежит логическое ИЛИ ||
. И поэтому &&
имеет больший приоритет, чем ||
.
Чтобы узнать больше о группах / уровнях предшествования операторов, посмотрите внизу this или that .