Je me demandais si la prochaine déclaration pourrait conduire à une erreur de protection et à d’autres horribles choses si la valeur de next est NULL (le nœud étant une liste chaînée).
if (!node->next || node->next->some_field != some_value) {
En supposant que la deuxième partie du OU ne soit pas évaluée une fois que la première partie est vraie. Ai-je tort de supposer cela? Ce compilateur est-il spécifique?
Dans la norme ISO-IEC-9899-1999 (C99), Section 6.5.14:
Le || L’opérateur doit donner 1 si l’un de ses opérandes est différent de 0; sinon, il donne 0. Le résultat est de type int. 4 Contrairement au bitwise | opérateur, le || l’opérateur garantit une évaluation de gauche à droite; il y a un sharepoint séquence après l’évaluation du premier opérande. Si le premier opérande est différent de 0, le deuxième opérande n’est pas évalué.
Ce n’est pas spécifique au compilateur. Si node->next
vaut NULL
, le rest de la condition n’est jamais évalué.
Dans un bloc opératoire,
if ( expr_1 || expr_2)
expr_2 n’est ‘testé’ que lorsque expr_1 échoue (est faux)
Dans un AND
if( expr_1 && expr_2 )
expr_2 n’est ‘testé’ que lorsque expr_1 réussit (est vrai)
Il est prudent de supposer que l’expression booléenne du côté droit ne sera pas évaluée si le côté gauche est évalué à true. Voir la question pertinente .
Ce n’est pas spécifique au compilateur. Vous pouvez compter sur les courts-circuits en toute sécurité et votre code fonctionnera comme prévu.
Vous avez raison.
Il est comstackr independent
et toujours la first
condition avant l’opérateur OR
( !node->next
) est évaluée avant l’évaluation de la second
condition ( node->next->some_field != some_value
) après l’opérateur OR
Si la first
condition est true
, l’ expression
entière est évaluée à true
sans évaluer la second
condition.
Vous ne faites que tirer le meilleur parti de cette fonctionnalité pour votre linked list
. Vous allez plus loin pour accéder next
pointeur next
uniquement s’il n’est not NULL
.