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

Résolu/Fermé
gigisan - 3 mars 2009 à 12:01
 loupius - 4 mars 2009 à 01:07
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
3 mars 2009 à 18:55
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 vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
3 mars 2009 à 12: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
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 vendredi 20 juin 2008 Statut Membre Dernière intervention 20 juillet 2009 28
3 mars 2009 à 19:34
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
3 mars 2009 à 19:58
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
3 mars 2009 à 21:18
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
3 mars 2009 à 22:38
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > loupius
3 mars 2009 à 22:48
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
4 mars 2009 à 01:07
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

Discussions similaires