39 votes

Opérateur de virgule en c

 #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?

63voto

El Profesor Points 10915

Quelqu'un peut-il expliquer comment la sortie est 2?

Parce que la priorité de l' opérateur d'affectation ( = ) est supérieure à celle de l' opérateur de virgule ( , ).

Par conséquent, la déclaration:

a = (1, 2), 3;

est équivalent à:

(a = (1, 2)), 3;

et l'expression (1, 2) évaluée à 2 .

29voto

haccks Points 33022

Quelqu'un peut-il expliquer comment la sortie est de 2?

Dans la déclaration

a = (1, 2), 3;   

, utilisé est un opérateur virgule. En raison de la hausse la priorité de l'opérateur de = opérateur que celui de l' , de l'opérateur, l'expression opérande (1, 2) va se lier d' = comme

(a = (1, 2)), 3;  

Dans le cas de l'opérateur virgule, l'opérande de gauche d'un opérateur virgule est évalué à un vide d'expression, puis l'opérande de droite est évaluée et le résultat a de la valeur et du type de l'opérande de droite.

Il y a deux virgule opérateurs ici. Pour le premier opérateur virgule dans l'expression (1, 2), 1 seront évalués à vide d'expression et puis, 2 seront évaluées et seront affectés à l' a.
Maintenant, effets secondaires a a eu lieu et, par conséquent, l'opérande de droite de la deuxième opérateur virgule 3 sera évaluée et la valeur de l'expression (a = (1, 2)), 3 sera 3.

4voto

Rui Silva Points 173

le résultat:

a = x, y     =>     x

a = (i, j)   =>     j

par conséquent, si nous avons:

x = (1 , 2)

a = (1 , 2) , 3     =>     2

Comme l'a dit ici:

L'opérateur virgule sépare des expressions (qui ont de la valeur) d'une manière analogue à la façon dont le point-virgule qui termine déclarations, et des séquences de les expressions sont entre parenthèses, par analogie, à la façon des séquences des déclarations sont placés entre accolades: (a, b, c) est une séquence de expressions séparées par des virgules, qui évalue à la dernière l'expression de c, tandis que {a; b; c;} est une séquence d'instructions, et ne ne pas évaluer à une valeur quelconque. Une virgule peut seulement se produire entre les deux expressions – virgules expressions distinctes – à la différence du point-virgule, qui se produit à la fin d'une (non -) bloc de déclaration – des points-virgules mettre fin à des déclarations.

L'opérateur virgule a la priorité la plus basse de tout C de l'opérateur, et agit comme un point de séquence. Dans une combinaison de virgules et des points-virgules, des points-virgules ont priorité plus basse que la virgule, point-virgules séparent états mais des virgules se produisent à l'intérieur des états, ce qui s'accorde avec leur utilisation en tant que simples signes de ponctuation: a, b, c, d est regroupé en tant que (a, b); (c, d) parce que ces deux états distincts.

J'espère que cela répond à votre question.

Prograide.com

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.

Powered by:

X