Ordre d’exécution OU logique en C

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 .