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
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
++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.
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. –
@Stephen: ottimo punto, lo aggiungo alla risposta. – sepp2k
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 . –
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.
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 ++
.
'++ val ++' è uguale a '++ (val ++)', che è ** non ** uguale a '(++ val) ++'. (Anche se in C, entrambi sono sintatticamente invalidi) –
@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
ah, ma in C++, uno di questi non è valido mentre l'altro è sintatticamente valido ma semanticamente indefinito. (C++ è stravagante!) –
Si noti inoltre che si sta modificando l'indirizzo del puntatore
int k = ++*p++;
sì, lo so. L'ho usato per semplicità. Invece di int val, avrei potuto usare int array. – understack
In casi come questo, spesso aiuta a inviare anche i messaggi di errore che stai vedendo e il compilatore (versione) sei utilizzando. – sbi
Nessuno dovrebbe mai scrivere codice come questo. – duffymo
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. –