Veuillez expliquer ce bloc de code :
void main()
{
int t,
a = 5,
b = 10,
c = 15;
t = (++a && ++b, ++a), ++a || ++c; // need explanation for this line
printf("%d %d %d %d", t, a, b, c);
}
Veuillez expliquer ce bloc de code :
void main()
{
int t,
a = 5,
b = 10,
c = 15;
t = (++a && ++b, ++a), ++a || ++c; // need explanation for this line
printf("%d %d %d %d", t, a, b, c);
}
L'opérateur virgule renvoie le résultat de son second opérande, et l'opérateur ||
l'opérateur court-circuite. Donc ce qui se passe dans ce cas est :
++a
est évaluée, a
est maintenant 6
.
Puisque le résultat de (1) était non nul, le côté droit de l'équation &&
est évaluée. Cela signifie que ++b
donc b
devient 11
.
(1) et (2) sont le côté gauche d'un opérateur virgule, donc le résultat de l'opérateur &&
est rejetée. (c'est 1
si cela vous importe).
Le site ++a
sur le côté droit de la première ,
est évaluée. a
est maintenant 7
.
l'affectation à t
a lieu - t
est maintenant 7
le résultat du premier opérateur à virgule.
Tout cela était le côté gauche d'un autre opérateur de virgule, donc le résultat ( 7
) est écarté. Suivant ++a
est évaluée. a
est maintenant 8
.
Desde a
est différent de 0, le ||
les courts-circuits, et les ++c
n'est pas évalué. c
reste 15
.
Résultats : t
es 7
, a
es 8
, b
es 11
y c
es 15
. Le site printf
les sorties du relevé :
7 8 11 15
Globalement, ce code serait plus facile à comprendre si vous écriviez simplement :
++a;
++b;
t = ++a;
++a;
Qui a précisément le même comportement.
Exécution ->
t = (++a && ++b, ++a), ++a || ++c; // () Priority
^
t = (++a && ++b, ++a), ++a || ++c; // ++a -> a = 6
^
t = ( 6 && ++b, ++a), ++a || ++c; // ++b -> b = 11
^
t = ( 6 && 11 , ++a), ++a || ++c; // 6 && 11 -> 1
^
t = ( 1 , ++a), ++a || ++c; // ++a -> a = 7
^
t = ( 1 , 7), ++a || ++c; // (1,7) -> 7 ... Comma operator has less priority
^
t = 7, ++a || ++c; // (t = 7), ++a || ++c; ...Assigned value to t... Comma operator has less priority
^
++a || ++c; // ++a -> a = 8
^
8 || ++c; // 8 || ++c -> 1 ...as 1 || exp -> 1...Logical OR skip next part if 1st exp is true
^
Enfin ->
t = 7
a = 8
b = 11
c = 15
int t, a = 5, b = 10, c = 15;
En C (et C++), l'opérateur virgule évalue son premier opérande, le rejette, évalue son second opérande et le renvoie.
++a && ++b
est d'abord évalué, a est maintenant 6, b est maintenant 11.
(++a && ++b, ++a)
maintenant le deuxième opérande à droite de la virgule ( ++a
) est évalué, a est maintenant 7. De même, à ce stade, t est affecté à la valeur 7. En effet, l'opérateur d'assignation a une plus grande priorité que l'opérateur de virgule. .
(++a && ++b, ++a), ++a now the second operand to the right of
(++a && ++b, ++a) is evaluated. The third
++a` donne la valeur de a comme 8.
La logique ||
L'opérateur évalue son premier opérande et s'il s'agit de true
il n'évalue pas le second opérande. Le premier opérande (++a && ++b, ++a), ++a
est non nul (vrai) et donc le ++c n'est pas évalué. La valeur de c reste à 15.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.