Problème en C (incrémententation de variable)

Résolu
gigisan -  
 loupius -
Bonjour,
Une question concernant le petit programme en langage C qui suit

#include <iostream>
#include<stdio.h>
using namespace std;

int main()
{
int N, P, Q;
N = 5; P = 2;
Q = N++ > P || P++ != 3;
printf ("C : N=%d P=%d Q=%d\n", N, P, Q);
N = 5; P = 2;
Q = N++ < P || P++ != 3;
printf ("D : N=%d P=%d Q=%d\n", N, P, Q);
return 0;
}

affiche à l'exécution:

C: N=6 P=2 Q=1
D: N=6 P=3 Q=1

Je ne comprends pas ce qui se passe pour la variable P à la 1ère ligne:

P++ != 3 compare P = 2 à 3 et retourne 1(vrai car 2 != 3) puis incrémente P qui devrait prendre la valeur 3 comme à la deuxième ligne

Si quelqu'un veut bien éclairer ma lanterne je le remercie d'avance
Vous avez compris bien sur que je débute en C.

Gilbert BONNET

3 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
N = 5; P = 2; 
Q = N++ > P || P++ != 3;

N++ > P est évalué en premier. On compare N à P soit 5>2 (qui retourne vraie) et on incrémente N (qui devient 6). Comme le premier membre du OU est vraie. Le résultat sera forcément vraie. Donc le deuxième membre n'est pas évalué. Donc à la fin de cette ligne N vaut 6, Q vaut 1 et P vaut 2.


N = 5; P = 2; 
Q = N++ < P || P++ != 3;

Même principe. Sauf qu'ici le premier membre du OU est faux. Donc on évalue le deuxième membre, ce qui a pour conséquence de post incrémenté P. On compare P (2) à 3, qui renvoie logiquement 1 (car différent) et incrémenté P (donc P vaut 3).
D'où à la fin de l'instruction N vaut 6, Q vaut 1 et P vaut 3.

Ouf, la machine n'a pas dit de bêtises :-).
1
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
(N++ est incrémenté et est comparé à P qui vaut 2 à la base. N++ = 6, 6>2 renvoie ??)

||

(P est incrémenté d'abord, donc P = 3, et il est ensuite comparé à 3, 3!=3 -> faux, renvoie ?.)

Donc Q vaut? :)
0
gigisan
 
Tout d'abord, merci de votre réponse rapide

Vous dites : (N++ est incrémenté et est comparé à P qui vaut 2 à la base. N++ = 6, 6>2 renvoie ??)

Je ne suis pas d'accord N est comparé à P (N = 5, 5>2 qui renvoie 1) puis seulement ensuite incrémenté N++ = 6

s'il y avait ++N > P je serais d'accord, mais ce n'est pas le cas.

Dans les deux cas l'expression booléenne renvoie 1

|| (ou logique)

Vous dites ensuite : (P est incrémenté d'abord, donc P = 3, et il est ensuite comparé à 3, 3!=3 -> faux, renvoie ?.)Donc Q vaut? :)
Je ne suis pas d'accord P est comparé à 3 (P = 2, 2 =!3 qui renvoie 1) puis seulement ensuite incrémenté P++ = 3

1 || 1 renvoie 1 (de toute façon 1 || 0 renvoie 1 aussi pour Q)

Ce qui est inexplicable c'est pourquoi à la première ligne P vaut 2 après l'exécution du programme que j'ai fait tourner avec code:: blocks IDE sous Mandriva , alors qu'a la deuxième ligne il vaut 3 alors que les deux expression se ressemblent beaucoup!
0
[o.o]REplay Messages postés 357 Date d'inscription   Statut Membre Dernière intervention   28
 
Il a entièrement raison ^^

dans (x || y), si x vrai, alors y n'est pas vérifié.
De même dans (x & y), si x faux, y ne sera pas vérifié.

Et désolé pour mon incompréhension sur le N++ et le ++N, tu avais raison :)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
De même dans (x & y), si x faux, y ne sera pas vérifié.
Non pas avec le simple &. Avec && par contre, oui, si le premier membre est faux alors le deuxième ne sera pas évalué.
0
gigisan > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
fiddy

Merci beaucoup pour ton explication très simple et très claire!

En tout cas me voila réconcilié avec mon mon compilateur :)

Encore merci à tous les deux : vos deux contributions m'encouragent à m'avancer plus avant dans la jungle de C

Gilbert BONNET
0
loupius > gigisan
 
Réconcilir avec mon compilateur... mais je l'ai toujours été!
J'ai toujours considéré que c'est lui qui avais toujours raison... et qu'on me démondre la contraire ;-)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > loupius
 
J'ai toujours considéré que c'est lui qui avais toujours raison
Sauf quand il ne respecte pas la norme. Et ça arrive :d.
0
loupius > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui, c'est vrai si on cherche la limite; mais en général, avant d'accuser le compilateur, je remets d'abord en cause mes lignes de code.
Bonne nuit.
0