O que uma tarefa retorna?

Por que uma expressão i = 2 retorna 2? Qual é a regra na qual isso se baseia?

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

Eu estou no domínio C depois de passar muito tempo em Java / C #. Perdoe minha ignorância.

Ele é avaliado como 2 porque é assim que o padrão o define. De C11 Standard , seção 6.5.16:

Uma expressão de atribuição tem o valor do operando esquerdo após a atribuição

É permitir coisas assim:

 a = b = c; 

(embora haja algum debate sobre se um código como esse é bom ou não.)

Aliás, esse comportamento é replicado em Java (e eu apostaria que é o mesmo em C # também).

A regra é retornar o operando à direita de = convertido para o tipo da variável à qual é designado.

 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. Atribuir o valor 2 para i
  2. Avalie a variável i e exiba-a

Em C (quase) todas as expressões têm duas coisas
1) um valor
2) um efeito colateral

O valor da expressão

 2 

é 2 ; seu efeito colateral é “nenhum”;

O valor da expressão

 i = 2 

é 2 ; seu efeito colateral é “mudar o valor no object chamado i para 2″;

Considere primeiro a expressão e depois imprima a variável mais à esquerda.

exemplo:

 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++ é postfix e ++x é prefixo assim:

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