Problème en C (incrémententation de variable)
Résolu
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
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
Configuration: Linux Mandriva Firefox 3.0.6
3 réponses
-
ContributeurSalut,
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 :-). -
(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? :)
-
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!
-
-
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 :)
-
-
@fiddyfiddy
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 -
@gigisanRé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 ;-) -
Contributeur@loupiusJ'ai toujours considéré que c'est lui qui avais toujours raison
Sauf quand il ne respecte pas la norme. Et ça arrive :d. -
@fiddyOui, 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.
-