web-dev-qa-db-fra.com

Opérateur 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?

38
Kr Arjun

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.

30
haccks

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.

62
El Profesor

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.

3
Rui Silva