2015-02-05 8 views
6

Ci sono un sacco di differenze tra C e C++ ed è venuto ad bloccato su uno di essi Lo stesso codice dà un errore in C mentre solo esegue bene in C++ Si prega di spiegare il motivo peroperatore ternario in C vs C++

int main(void) 
{ 
    int a=10,b; 
    a>=5?b=100:b=200; 
} 

il codice di cui sopra dà un errore nel C affermando lvalue richiesto mentre lo stesso codice compila bene in C++

+1

wow, ora questa domanda è quasi un duplicato esatto, non solo un possibile. Tutte le domande sono quasi uguali anche se i voti sono abbastanza simili! (Wooho ha ottenuto -3 bello) – Rizier123

risposta

16

Dai un'occhiata alla precedenza dell'operatore.

Senza un esplicito () il codice si comporta come

(a >= 5 ? b = 100 : b) = 200; 

Il risultato di un'espressione ?: non è un lvalue modificabile[#] e quindi non possiamo assegnare i valori ad esso.

Inoltre, degno di menzione, come da regola c sintassi,

assegnazione è mai permesso di apparire sul lato destro di un operatore condizionale

Relared Riferimento: C precedence table.

OTOH, In caso di c++, ben,

dell'operatore condizionale ha la stessa precedenza assegnazione.

e sono raggruppati da destra a sinistra, in sostanza, rendendo il codice si comportano come

a >= 5 ? (b = 100) : (b = 200); 

Quindi, il codice funziona bene in caso di c++


[#] - Come da capitolo 6.5.15, nota in calce (12), C99 standard,

Un'espressione condizionale non produce un lvalue.

6

causa C e C++ non sono la sa me lingua, e stai ignorando il compito implicito dal ternario. Penso che volessi

b = a>=5?100:200; 

che dovrebbe funzionare sia in C che in C++.

5

In C è possibile risolvere il problema inserendo l'espressione tra parentesi in modo che la valutazione dell'assegnazione diventi valida.

int main(void) 
{ 
    int a=10,b; 
    a>=5?(b=100):(b=200); 
} 

L'errore è perché non ti interessa la precedenza e l'ordine di valutazione dell'operatore.