J'ai une question, comment le compilateur fonctionne sur le code suivant:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Je ne sais pas pourquoi le résultat est d = 11
.
J'ai une question, comment le compilateur fonctionne sur le code suivant:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Je ne sais pas pourquoi le résultat est d = 11
.
Réponses:
Dans
int d = (b == c++) ? (c+1) : (c-1);
:c++
est la valeur actuelle dec
, 11. Séparément,c
est incrémenté à 12.b == 11
est faux, carb
est 12.(b == c++)
c'est faux,(c-1)
est utilisé. De plus, l'incrémentation dec
à 12 doit être terminée à ce stade.c
12 ans,c-1
c'est 11.d
est initialisé à cette valeur, 11.la source
Selon la norme C (6.5.15 Opérateur conditionnel)
Donc, dans l'expression d'initialisation de cette déclaration
la variable
b
est comparée à la valeur de la variablec
car l'opérateur de post-incrémentation renvoie la valeur de son opérande avant de l'incrémenter.Comme les valeurs ne sont pas égales les unes aux autres (
b
est définie sur 12 tandis qu'ellec
est définie sur 11), la sous-expression(c-1)
est évaluée.Selon la citation, il y a un point de séquence après l'évaluation de la condition de l'opérateur. Cela signifie qu'après évaluation de la condition
c
a la valeur12
après avoir appliqué l'opérateur post-incrément à la variablec
. Par conséquent, la variable d est initialisée par la valeur1
(12 - 1
).la source
?:
. Parce que normalement en C, la combinaison++
avec d'autres opérations sur le même opérande est un comportement non défini. Et ce code ne fonctionne que de manière prévisible car il?:
a diverses règles spéciales de flocon de neige.Beacuse la condition est fausse, donc le
false
cas se produira :,c-1
mais puisque vous avez incrémentéc
la condition parc++
,c
c'est maintenant12
. Le résultat est donc 12 - 1 qui est 11.EDIT: L'OP a mal compris l'incrément de poste.
Donc, ce qui se passe réellement est comme ceci:
la source
c++
l'état de la situation. La condition est fausse, mais la orginal valeurc
est utilisée pour calculerc - 1
, pas la version incrémentiels.c++
et++c
c++
est l' opérateur post- incrément. La valeur dec++
est 11, avec pour effet secondaire de fairec == 12
.++c
aurait la valeur de 12.Traduit en une instruction if régulière, votre code ressemblerait à ceci:
L'indice ici est que c est incrémenté après vérification de la condition. Vous entrez donc dans l'
else
état mais c y a déjà la valeur 12.la source
Voir Opérateur ternaire.
Syntaxe
Vous avez donc écrit
Dans cette situation, le résultat sera 11 car, après les vérifications, la valeur 'c' est augmentée (c + 1 = 12) et seulement après cela, elle définit la valeur 'd' comme c (12) -1 qui est 11.
Si vous avez utilisé, par exemple:
La valeur "c" serait augmentée avant de vérifier la déclaration, elle serait donc vraie et la valeur "d" serait c (12) +1, ce qui correspond à 13.
la source