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 pasx && 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é queanarray.contains (3) code> évalue verstrue code>, la valeur de retour desortraitandcheck (tableau: & anarray) code> sera évalué. En supposant quetrue && x code> est toujoursvrai code> serait une erreur.&& code> peut être court-circuité iff gauche côté gauche estfalse code>