#include<stdio.h>
int main(void) {
int a=(1, 2), 3;
printf("%d", a);
return 0;
}
sortie: 2
Quelqu'un peut-il expliquer comment la sortie est 2?
Quelqu'un peut-il expliquer comment la sortie est 2?
Dans la déclaration
a = (1, 2), 3;
,
utilisé est un opérateur virgule . En raison de la priorité de l'opérateur plus élevée de =
opérateur que celui de ,
opérateur, l'expression opérande (1, 2)
se liera à =
as
(a = (1, 2)), 3;
Dans le cas d'un opérateur virgule, l'opérande gauche d'un opérateur virgule est évalué en une expression void, puis l'opérande droit est évalué et le résultat a la valeur et le type de l'opérande droit .
Il y a deux opérateurs virgule ici. Pour le premier opérateur virgule dans l'expression (1, 2)
, 1
sera évalué pour annuler l'expression, puis 2
sera évalué et affecté à a
.
L'effet secondaire de a
a maintenant eu lieu et donc l'opérande droit du deuxième opérateur virgule 3
sera évalué et la valeur de l'expression (a = (1, 2)), 3
sera 3
.
Quelqu'un peut-il expliquer comment la sortie est 2?
Parce que la priorité de opérateur d'affectation (=
) Est supérieure à opérateur virgule (,
).
Par conséquent, la déclaration:
a = (1, 2), 3;
est équivalent à:
(a = (1, 2)), 3;
et l'expression (1, 2)
est évaluée à 2
.
le résultat de:
a = x, y => x
a = (i, j) => j
par conséquent, si nous avons:
x = (1 , 2)
a = (1 , 2) , 3 => 2
Comme dit ici :
L'opérateur virgule sépare les expressions (qui ont une valeur) d'une manière analogue à la façon dont le point-virgule termine les instructions, et les séquences d'expressions sont placées entre parenthèses de manière analogue à la façon dont les séquences d'instructions sont placées entre accolades: (a, b, c) est une séquence d'expressions, séparées par des virgules, qui donne la dernière expression c tandis que {a; b; c;} est une séquence d'instructions et n'évalue aucune valeur. Une virgule ne peut se produire qu'entre deux expressions - des expressions séparées par des virgules - contrairement au point-virgule, qui apparaît à la fin d'une instruction (non bloc) - les points-virgules terminent les instructions.
L'opérateur virgule a la priorité la plus faible de tout opérateur C et agit comme un point de séquence. Dans une combinaison de virgules et de points-virgules, les points-virgules ont une priorité plus faible que les virgules, car les points-virgules séparent les instructions, mais les virgules apparaissent dans les instructions, ce qui correspond à leur utilisation comme ponctuation ordinaire: a, b; c, d est groupé comme (a, b); (c, d) parce que ce sont deux déclarations distinctes.
J'espère que cela répond à votre question.