0
votes

Swift Court-circuit avec des opérateurs logiques ne fonctionnant pas comme prévu

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]
}
For the second if statement, since anArray.contains(3) is already true, why does sortAndCheck(array: &anArray) still get evaluated and sort anArray?

2 commentaires

Avec l'exécution de court-circuit, votre code est équivalent à si anarray.contains (3) {si SortandCheck (tableau: & anarray) {imprimé (anarray)}} . Étant donné que anarray.contains (3) évalue vers true , la valeur de retour de sortraitandcheck (tableau: & anarray) sera évalué. En supposant que true && x est toujours vrai serait une erreur.


&& peut être court-circuité iff gauche côté gauche est false


4 Réponses :


5
votes

Court-circuit signifie que la partie suivante de l'expression n'est pas évaluée que si le résultat est déjà clair. Si la pièce avant && code> est true code>, le résultat peut toujours être à la fois false code> et true code> et la partie suivante a em> à évaluer.

Les cas sont: p> xxx pré>

et après l'évaluation de l'opérande gauche, nous avons: P>

false && ??


0 commentaires

3
votes

Le résultat d'un ET ( && ) opération booléenne ne peut être vrai si les deux côtés de l'opérateur && sont vraies, même si le premier opérande est vrai, le second doit encore être évalué.

Court-circuit ne peut se produire que si vous utilisez un ou opérateur ( || ) et son premier opérande évalue à true (résultant dans l'ensemble de l'expression de l'évaluation à la < code> true ) ou si vous utilisez un opérateur et son premier opérande évalue à false (résultant dans l'ensemble de l'expression d'évaluation à false ).


2 commentaires

L'exécution de raccourcis a lieu dans un troisième cas: enchaînement optionnel


@ Carpen90 Vous avez raison, mais cela n'est pas liée aux opérateurs booléens, que cette question était à propos de



1
votes

Etant donné que vous utilisez && opérateur dans si instruction, sorraandcheck (tableau: & anarray) fonction doit être exécuté.

Si vous utilisez || opérateur dans si instruction, sorraandcheck (tableau: & anarray) ne sera pas exécuté lorsque Anarray .Contains (3) est vrai .


0 commentaires

2
votes

Depuis Anarray.Contains (3) est déjà vrai, pourquoi SortandCheck (tableau: & Anarray) est-il toujours évalué

parce que x n'implique pas x && y . Si l'expression utilisait || à la place, vous auriez raison, et la deuxième partie n'aurait pas besoin d'être évaluée. Mais les deux opérandes dans une expression et expression doivent être vraies pour que l'expression soit vraie.


0 commentaires