2012-03-01 14 views
20

Perché un'espressione i = 2 restituisce 2? Qual è la regola su cui si basa?Cosa restituisce un compito?

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

io sono nel dominio C dopo aver trascorso molto tempo in Java/C#. Perdona la mia ignoranza.

risposta

12

La regola è di restituire l'operando di destra di = convertito nel tipo di variabile a cui è assegnato.

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 
+0

Potrebbe fornire un punto di riferimento?Oli Charlesworth dice che nel C99 è il valore dell'operando di sinistra, quindi questa sarebbe una differenza con C++? – Benoit

+0

http://msdn.microsoft.com/en-us/library/b0zx90af(v=vs.80).aspx per esempio. – foxx1337

+0

Quindi, questo è in contraddizione con la tua risposta (rvalue => lvalue, lato destro => lato sinistro). – Benoit

33

E viene valutata-2 perché è così che la norma definisce. Da C11 Standard, sezione 6.5.16:

un'espressione di assegnazione ha il valore dell'operando di sinistra dopo l'assegnazione

E 'per consentire cose come questa:

a = b = c; 

(anche se non c'è alcuni dibattiti sul fatto che un codice del genere sia o meno una cosa buona.)

Per inciso, questo comportamento è replicato in Java (e scommetto che è lo stesso anche in C#).

+0

grazie. Ok, ma non ho visto qualcuno usarlo in Java. – Nemo

+0

In genere sono d'accordo con questo quando 'a' e' b' sono la stessa cosa in contrasto con il solo fatto di essere lo stesso valore. Io uso lo stesso ragionamento per decidere tra 'int presentValue, previousValue;' vs. 'int myAge; int myHeight; '. I valori presenti e precedenti non dovrebbero mai avere tipi diversi, mentre potrei scegliere di usare un 'float' per la mia altezza invece di un' int'. Solo un altro livello di intento che può essere catturato. – altendky

+0

Link aggiornato da @SurajJain a C11. Ciò che questo costrutto * anche * consente è (molto più utile) 'if ((ptr = func())! = NULL)' ... – DevSolar

3
  1. Assegnare il valore 2 per i
  2. Valutare variabile i e visualizzarlo
2

In C (quasi) tutti i espressioni hanno 2 cose
1) un valore
2) un effetto collaterale

Il valore dell'espressione

2 

è 2; il suo effetto collaterale è "nessuno";

Il valore dell'espressione

i = 2 

è 2; il suo effetto collaterale è "cambiare il valore nell'oggetto chiamato i in 2";

+0

Completamente * 50% * delle possibili espressioni C sono '(void)' seguito da un'altra espressione (per certi valori di "proporzione di un insieme infinito"). Contano ha un valore o no? ;-) –

+0

No, le espressioni '(void)' non hanno valore. Ad esempio: l'espressione 'free (pointer)' non ha valore. – pmg

+0

@ pmg: 'free (pointer)' non ha valore, ma non è inutile, anche se molti programmatori ritengono che non valga la pena. – chqrlie

1

Considerare prima l'espressione, quindi stampare la variabile più a sinistra.

esempio:

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 è prefisso in modo:

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

* sai che i calcoli sono fatti da destra a sinistra. * Non proprio. I calcoli possono essere eseguiti in qualsiasi ordine, compresi i compiti. I valori degli argomenti vengono calcolati prima che la funzione venga chiamata, ma si tratta dell'unica ipotesi che puoi fare. La cosa importante da capire è il concetto di punto di sequenza. – chqrlie

+0

Hai ragione uomo! ma intendo quelli semplici come x = y + z, ho modificato la risposta, grazie. –

Problemi correlati