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?
4 Réponses :
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 Les cas sont: p> et après l'évaluation de l'opérande gauche, nous avons: P> && code> est
true code>, le résultat peut toujours être à la fois
false code> et
true code> et la partie suivante a em> à évaluer.
false && ??
Le résultat d'un ET ( Court-circuit ne peut se produire que si vous utilisez un ou opérateur ( && code>) opération booléenne ne peut être vrai si les deux côtés de l'opérateur
&& code> sont vraies, même si le premier opérande est vrai, le second doit encore être évalué. P>
|| code>) et son premier opérande évalue à
true code> (résultant dans l'ensemble de l'expression de l'évaluation à la < code> true code>) ou si vous utilisez un opérateur et son premier opérande évalue à
false code> (résultant dans l'ensemble de l'expression d'évaluation à
false code>). p>
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
Etant donné que vous utilisez Si vous utilisez && code> opérateur dans
si code> instruction,
sorraandcheck (tableau: & anarray) code> fonction doit être exécuté. p>
|| code> opérateur dans
si code> instruction,
sorraandcheck (tableau: & anarray) code> ne sera pas exécuté lorsque
Anarray .Contains (3) code> est
vrai code>. p>
Depuis Anarray.Contains (3) est déjà vrai, pourquoi SortandCheck (tableau: & Anarray) est-il toujours évalué p> blockQuote>
parce que
x code> n'implique pas
x && y code>. Si l'expression utilisait
|| code> à 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. P>
Avec l'exécution de court-circuit, votre code est équivalent à
si anarray.contains (3) {si SortandCheck (tableau: & anarray) {imprimé (anarray)}} code>. Étant donné que
anarray.contains (3) code> évalue vers
true code>, la valeur de retour de
sortraitandcheck (tableau: & anarray) code> sera évalué. En supposant que
true && x code> est toujours
vrai code> serait une erreur.
&& code> peut être court-circuité iff gauche côté gauche est
false code>