Que renvoie une cession?

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 
  1. Atsortingbuer la valeur 2 à i
  2. Évaluez la variable i et affichez-la

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