Pourquoi une expression i = 2
renvoie-t-elle 2? Quelle est la règle sur laquelle est basé?
printf("%d\n", i = 2 ); /* prints 2 */
Je suis dans le domaine C après avoir passé beaucoup de temps en Java / C #. Pardonne mon ignorance.
Il est évalué à 2
car c’est ainsi que le standard le définit. De la norme C11 , section 6.5.16:
Une expression d’affectation a la valeur de l’opérande gauche après l’affectation
C’est pour permettre des choses comme ça:
a = b = c;
(Bien qu’il y ait un débat quant à savoir si un tel code est une bonne chose ou non.)
Incidemment, ce comportement est répliqué en Java (et je parierais que c’est la même chose en C #).
La règle consiste à retourner l’opérande de droite de =
converti au type de la variable affectée.
int a; float b; a = b = 4.5; // 4.5 is a double, it gets converted to float and stored into b // this returns a float which is converted to an int and stored in a // the whole expression returns an int
En C (presque) toutes les expressions ont 2 choses
1) une valeur
2) un effet secondaire
La valeur de l’expression
2
est 2
; son effet secondaire est “aucun”;
La valeur de l’expression
i = 2
est 2
; son effet secondaire est “changer la valeur de l’object nommé i
en 2″;
Il considère d’abord l’expression, puis affiche la variable la plus à gauche.
Exemple:
int x,y=10,z=5; printf("%d\n", x=y+z ); // firstly it calculates value of (y+z) secondly puts it in x thirdly prints x
Remarque:
x++
est postfix et ++x
est préfixe donc:
int x=4 , y=8 ; printf("%d\n", x++ ); // prints 4 printf("%d\n", x ); // prints 5 printf("%d\n", ++y ); // prints 9