Évaluation de court-circuit sur C

J’étudie C de A Book on C de Kelley-Pohl, et voici un exercice que je ne comprends pas:

int a = 0, b = 0, x; x = 0 && (a = b = 777); printf("%d %d %d\n", a, b, x); x = 777 || (a = ++b); printf("%d %d %d\n", a, b, x); 

Ils se contentent de dire d’imaginer la sortie et de la comparer à la vraie. Je pensais que la sortie aurait été

777 777 0

778 778 1

mais il est

0 0 0

0 0 1

L’opérateur && utilise l’ évaluation paresseuse . Si l’un des côtés de l’opérateur && est false , l’expression entière est false .

C vérifie la valeur de vérité du côté gauche de l’opérateur, qui dans votre cas est 0 . Puisque 0 est faux dans c, l’expression de l’opération de droite, (a = b = 777) , n’est jamais évaluée.

Le second cas est similaire, sauf que || renvoie true si l’expression de gauche renvoie true . Rappelez-vous également que dans c, tout ce qui n’est pas 0 est considéré comme true .

J’espère que cela t’aides.

A partir de la norme C (6.5.13 opérateur logique AND)

3 L’opérateur && doit donner 1 si ses deux opérandes se comparent de manière inégale à 0; sinon, il donne 0 . Le résultat est de type int.

et

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

Dans cette déclaration d’expression

 x = 0 && (a = b = 777); 

le premier opérande est égal à 0. Le deuxième opérande n’est donc pas évalué, c’est-à-dire que les valeurs des variables a et b ne sont pas modifiées. La variable x sera donc définie sur 0 conformément au paragraphe 3 de la section.

A partir de la norme C (6.5.14 opérateur logique OU)

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

et

4 Contrairement au bitwise | opérateur, le || 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 différent de 0, le deuxième opérande n’est pas évalué.

Dans cette déclaration d’expression

 x = 777 || (a = ++b); 

le premier opérande est différent de 0. Le deuxième opérande n’est donc pas évalué, c’est-à-dire que les valeurs des variables a et b ne sont pas modifiées. La variable x sera donc définie sur 1 conformément au paragraphe 3 de la section.

Si vous voulez changer l’ordre des opérandes dans les expressions comme

 x = (a = b = 777) && 0; x = (a = ++b) || 777; 

vous obtenez le résultat attendu par votre résultat.