¿Qué devuelve una tarea?

¿Por qué una expresión i = 2 devuelve 2? ¿Cuál es la regla en la que se basa?

printf("%d\n", i = 2 ); /* prints 2 */

Estoy en el dominio C después de pasar mucho tiempo en Java / C #. Perdona mi ignorancia

Evalúa a 2 porque así es como lo define el estándar. De C11 Standard , sección 6.5.16:

Una expresión de asignación tiene el valor del operando de la izquierda después de la asignación

Es para permitir cosas como esta:

 a = b = c; 

(Aunque hay cierto debate sobre si un código así es bueno o no).

Dicho sea de paso, este comportamiento se replica en Java (y yo apostaría que es lo mismo en C # también).

La regla es devolver el operando de la mano derecha = convertido al tipo de la variable a la que está asignado.

 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. Asignar el valor 2 ai
  2. Evaluar la variable i y mostrarla

En C (casi) todas las expresiones tienen 2 cosas
1) un valor
2) un efecto secundario

El valor de la expresión

 2 

es 2 ; su efecto secundario es “ninguno”;

El valor de la expresión

 i = 2 

es 2 ; su efecto secundario es “cambiar el valor en el objeto llamado i a 2″;

Primero considera la expresión y luego imprime la variable más a la izquierda.

ejemplo:

 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 

Nota:

x++ es postfijo y ++x es prefijo así que:

 int x=4 , y=8 ; printf("%d\n", x++ ); // prints 4 printf("%d\n", x ); // prints 5 printf("%d\n", ++y ); // prints 9