2010-09-07 13 views
6
int val = 5; 

printf("%d",++val++); //gives compilation error : '++' needs l-value 

int *p = &val; 
printf("%d",++*p++); //no error 

Qualcuno potrebbe spiegare questi 2 casi? Grazie.Spiegazione di ++ val ++ e ++ * p ++ in C

+0

In casi come questo, spesso aiuta a inviare anche i messaggi di errore che stai vedendo e il compilatore (versione) sei utilizzando. – sbi

+7

Nessuno dovrebbe mai scrivere codice come questo. – duffymo

+0

Vota per chiudere non è una domanda reale. Codice come questo non si trova nella vita reale. Tutto ciò che è solo un accenno di sintassi come questo dovrebbe essere indirizzato a una FAQ che dice semplicemente di non essere stupida. –

risposta

27

++val++ è lo stesso di ++(val++). Poiché il risultato di val++ non è un lvalue, questo è illegale. E come Stephen Canon ha sottolineato, se il risultato di val++ fosse un lvalue, ++(val++) sarebbe un comportamento indefinito in quanto non vi è alcun punto di sequenza tra i ++ s.

++*p++ è lo stesso di ++(*(p++)). Poiché il risultato di *(p++)è un lvalue, questo è legale.

+1

Risposta eccellente, anche se noterei che anche se 'val ++' fosse un lvalue, il comportamento sarebbe ancora indefinito. '(++ val) ++' in C++, ad esempio, invocerebbe un comportamento indefinito. –

+0

@Stephen: ottimo punto, lo aggiungo alla risposta. – sepp2k

+1

L'operatore post-incremento restituisce sempre un 'rvalue' (sia in C che in C++). In C++, '(++ val) ++' richiama il comportamento indefinito perché l'operatore di pre-incremento ('++') restituisce un lvalue (in C++) e il valore di 'val' viene modificato più di una volta tra due punti di sequenza . –

0

int j = ++val++; //gives compilation error

Questo perché non è possibile pre-incremento di rvalue. ++val++ viene interpretato come ++(val++) poiché l'operatore di post-incremento ha precedenza più elevata rispetto all'operatore di pre-incremento. val++ restituisce un rvalue e l'operatore di pre-incremento richiede che l'operando sia un lvalue. :)

int k = ++*p++; //no error

++*p++ viene interpretato come ++(*(p++)), che è perfettamente valido.

4

L'espressione ++val++ è la stessa di (++val)++ (o forse ++(val++), in ogni caso non è molto pertinente). Il risultato dell'operatore ++ non è la variabile, ma il valore e non è possibile applicare l'operatore a un valore.

L'espressione ++*p++ corrisponde a ++(*(p++)). Il risultato di p++ è il valore, ma il risultato di *(p++) è una posizione di memoria a cui è possibile applicare l'operatore ++.

+0

'++ val ++' è uguale a '++ (val ++)', che è ** non ** uguale a '(++ val) ++'. (Anche se in C, entrambi sono sintatticamente invalidi) –

+0

@Stephen Canon: Sì, non è ovvio quale si valuta. Poiché l'espressione non è valida, non mi sono mai preso la briga di scoprire quale delle due varianti non valide sia.:) – Guffa

+0

ah, ma in C++, uno di questi non è valido mentre l'altro è sintatticamente valido ma semanticamente indefinito. (C++ è stravagante!) –

1

Si noti inoltre che si sta modificando l'indirizzo del puntatore

int k = ++*p++; 
+0

sì, lo so. L'ho usato per semplicità. Invece di int val, avrei potuto usare int array. – understack