55 votes

si avec plusieurs conditions, ordre d'exécution

Dans une instruction if avec plusieurs conditions, la seconde est exécutée si le résultat est clair après avoir vérifié la première condition?

exemple:

 if(i>0 && array[i]==0){
}
 

Si j'échange les conditions, une erreur de segmentation peut se produire pour les valeurs négatives de i mais de cette façon, le débogueur de mémoire ne trouve pas de problème. Puis-je être sûr que cela fonctionne toujours ou dois-je utiliser des instructions if imbriquées?

81voto

Uri Points 50687

Ce type d'évaluation est appelée de court-circuit. Une fois que le résultat est 100% clair, il ne veut pas continuer à évaluer.

C'est en fait une commune de la technique de programmation. Par exemple, en C++, vous verrez souvent quelque chose comme:

if (pX!=null && pX->predicate()) { bla bla bla }

Si vous avez changé l'ordre des conditions, vous pourriez être l'invocation d'une méthode sur un pointeur null et de s'écraser. Un exemple similaire en C serait d'utiliser le terrain d'un struct lorsque vous avez un pointeur vers cette structure.

Vous pourriez faire quelque chose de similaire avec ou:

if(px==null || pX->isEmpty()} { bla bla bla }

C'est aussi l'une des raisons pour laquelle il est généralement une bonne idée pour éviter les effets secondaires dans une condition if.

Par exemple, supposons que vous avez:

if(x==4 && (++y>7) && z==9)

Si x est de 4, alors y sera incrémenté quelle que soit la valeur de z ou y, mais si elle n'est pas 4, il ne sera pas incrémenté à tous.

32voto

John Bode Points 33046

Les opérateurs && et || garantie que la partie gauche de l'expression sera entièrement évalué (et tous les effets secondaires appliquée) avant le côté droit est évalué. OIE, les opérateurs introduisent un point de séquence.

En outre, si la valeur de l'expression peut être déterminé à partir de la lhs, rhs n'est pas évalué. OIE, si vous avez une expression comme x && y, et x prend la valeur 0 (faux), alors la valeur de l'expression est fausse, indépendamment de y, alors y n'est pas évalué.

Cela signifie que les expressions comme x++ && x++ sont bien définis, && introduit un point de séquence.

18voto

shiplu.mokadd.im Points 28895

Dans le projet de 3485 (n3485.pdf) Sa a clairement déclaré qu'

5.14 Logique ET l'opérateur [expr.journal.et]

logical-and-expression: 
      inclusive-or-expression
      logical-and-expression && inclusive-or-expression 
  1. Le && opérateur de groupes de gauche à droite. L' les opérandes sont à la fois contextuelle converti bool (Clause 4). L' le résultat est vrai si les deux opérandes sont true et false sinon. Contrairement à &, && garanties de gauche à droite de l'évaluation: le deuxième opérande n'est pas évalué si le premier opérande est faux.
  2. Le résultat est un booléen. Si l' la seconde expression est évaluée, chaque valeur de calcul et de côté effet associé à la première expression est séquencée avant chaque la valeur de calcul et des effets secondaires associés à la deuxième de l'expression.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X