Быстрое короткое замыкание с логическими операторами, работающими не так, как ожидалось - PullRequest
0 голосов
/ 02 января 2019
var anArray = [3, 2, 1]
func sortAndCheck(array: inout [Int]) -> Bool{
    array.sort()
    return array.contains(3)
}

if anArray.contains(3){
    print(anArray) // Prints [3, 2, 1]
}

if anArray.contains(3) && sortAndCheck(array: &anArray){
    print(anArray) // Prints [1, 2, 3]
}

Для второго оператора if, так как anArray.contains(3) уже истина, почему sortAndCheck(array: &anArray) все еще оценивается и сортирует anArray? enter image description here

Ответы [ 4 ]

0 голосов
/ 02 января 2019

, поскольку anArray.contains (3) уже имеет значение true, почему sortAndCheck (array: & anArray) по-прежнему оценивается

Поскольку X не подразумевает X && Y.Если бы вместо этого использовалось выражение ||, вы были бы правы, и вторую часть не нужно было бы оценивать.Но оба операнда в выражении AND должны быть истинными, чтобы выражение было истинным.

0 голосов
/ 02 января 2019

Результат логической операции AND (&&) может быть истинным только в том случае, если обе стороны оператора && имеют значение true, поэтому даже если первый операнд имеет значение true, второй по-прежнему необходимо оценивать.

Короткое замыкание может произойти, только если вы используете оператор ИЛИ (||), а его первый операнд оценивается как true (в результате все выражение оценивается до true) или если вы используетеОператор AND и его первый операнд оцениваются как false (в результате выражение в целом оценивается как false).

0 голосов
/ 02 января 2019

Поскольку вы используете оператор && в операторе if, должна быть выполнена функция sortAndCheck(array: &anArray).

Если вы используете оператор || в операторе if, sortAndCheck(array: &anArray) не будет выполняться, если anArray.contains(3) равно true.

0 голосов
/ 02 января 2019

Короткое замыкание означает, что следующая часть выражения не оценивается, только если результат уже ясен.Если часть до && равна true, то результатом все равно могут быть false и true, а следующая часть имеет для оценки.

Случаи:

1. true && true => true
2. true && false => false
3. false && false => false
4. false && true => false

И после вычисления левого операнда имеем:

true && ??

, который может заканчиваться в случае 1 или 2, которые имеют разные результаты.

Нас другой стороны, если бы у нас было:

false && ??

Тогда результатом будет либо случай 3, либо 4, которые оба равны false, и выражение будет закорочено.

...