En C, l’opérateur logique se termine-t-il si un côté d’un || est vrai?

En C ont les éléments suivants:

return (abc(1) || abc(2)); 

Si abc(1 == 1) renvoie true , appelez abc(2) ?

abc(2) sera appelé uniquement si abc(1) est false

Selon la spécification C99, l’opérateur OU logique dit

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é.

Non, ça ne va pas. C’est ce qu’on appelle “le court-circuit” et c’est un mécanisme de contrôle de stream courant:

Avec a && b , b n’est évalué que si a est vrai; si a est faux, toute l’expression doit nécessairement être fausse.

Avec a || b a || b , b n’est évalué que si a est faux; si a est faux, l’expression entière peut encore être vraie.

Non. Il est garanti (par The Standard ) que si abc(1) renvoie true , abc(2) ne sera PAS appelé.

Si abc(1) renvoie false , c’est garanti, abc(2) SERA appelé.


C’est similaire avec && : si vous avez abc(1) && abc(2) , abc(2) sera appelé UNIQUEMENT SI abc(1) renvoie true et ne sera PAS appelé, si abc(1) renvoie false .


L’idée derrière ceci est:

 true OR whatever -> true false OR whatever -> whatever false AND whatever -> false true AND whatever -> whatever 

Cela vient de l’ algèbre booléenne

Si abc (1 == 1) renvoie true, appelez abc (2)?

Non, ça ne va pas. Ce comportement est appelé court-circuit . Il est garanti par les normes C et C ++.

C11 (n1570), § 6.5.13 Opérateur AND logique

Contrairement à l’opérateur binary & bitwise, l’opérateur && garantit une évaluation de gauche à droite; si le deuxième opérande est évalué, il y a un sharepoint séquence entre les évaluations des premier et deuxième opérandes. Si le premier opérande est égal à 0, le deuxième opérande n’est pas évalué.

(L’accent est à moi.)

La même chose s’applique à || opérateur.

|| (comparaison logique) rompt la vérification ultérieure, alors que | (comparaison au niveau du bit) non.

Vous pourriez aussi lire: Différence entre | et || ou & et && pour comparaison

nop, le deuxième abc(2) est appelé uniquement si la déclaration de gauche est false

En C, la logique || l’opérateur est testé de gauche à droite, garanti. Pour que toute la déclaration soit vraie, l’une ou l’autre condition peut être vraie. So || continue à aller de gauche à droite jusqu’à ce qu’une condition soit vraie, puis s’arrête (ou arrive à la fin). Donc non, si abc(1) renvoie true, alors abc(2) ne sera pas appelé.

Contrastez avec && , qui continue de gauche à droite jusqu’à ce qu’une condition soit fausse (ou qu’elle finisse par arriver à la fin).

Non. Ceci est en fait non sortingvial et défini en standard que les opérateurs logiques sont évalués de gauche à droite. L’évaluation est arrêtée lorsque la valeur peut être déterminée sans autre évaluation des opérandes. Au moins, je suis sûr à 100% pour AND et OR .

Ce problème n’est pas anodin, car l’évaluation des opérandes ne peut donc pas être implicitement mise en parallèle ou optimisée par une réorganisation de l’ordre, le résultat attendu pouvant être différent.

Par exemple, des problèmes d’exécution dans des cas d’utilisation fréquents tels que if (*ptr && (ptr->number > other_number) )