Ordre d'exécution pour un si avec plusieurs conditions
Dans une instruction if avec de multiples conditions, est le second conditionnelle exécutée que si le résultat de la première est clair?
exemple:
if(i>0 && array[i]==0){
}
Si je swap les conditions d'une erreur peut se produire pour des valeurs négatives de moi, mais de cette façon, pas d'erreur de segmentation se produit. Puis-je être sûr que cela fonctionne toujours ou ne avoir avoir à utiliser les instructions if imbriquées?
Vous devez vous connecter pour publier un commentaire.
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:
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.
Que vous pourriez faire quelque chose de similaire avec ou:
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:
Si
x
est4
, puisy
sera incrémenté indépendamment de la valeur dez
ouy
, mais six
n'est pas4
, il ne sera pas incrémenté à tous.if (function_that_returns_neg_on_error(param1, param2) < 0) { perror("function"); return -1;}
Les opérateurs
&&
et||
garantir 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é. En d'autres termes, 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é. En d'autres termes, 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éfinies, depuis&&
introduit un point de séquence.De projet 3485 (n3485.pdf) clairement indiqué que