2016-01-30 26 views
5
#include <stdio.h> 
int main() 
{ 
    int a=3,b=4,g; 
    a > b ? g = a : g = b ; 
    printf("%d",g); 
    return 0; 
} 

Perché il valore di g non viene stampato? E il compilatore dice richiesto lvalue. Cosa significa?Dichiarazione di espressione ternaria non funzionante

+1

Devi cambiare 'a> b? g = a: g = b; 'a' g = a> b? a: b; 'o' a> b? g = a: (g = b); ' – pouyan

risposta

15

causa precedenza maggiore dell'operatore ?: sopra =, l'espressione

a > b ? g = a : g = b; 

verrà analizzato come

(a > b ? g = a : g) = b; 

L'espressione (a > b ? g = a : g) darà un rvalue. L'operando fianco di assegnazione dell'operatore (=) deve essere un lvalue (modificabile ).

Change

a > b ? g = a : g = b ; 

a

a > b ? (g = a) : (g = b);  

o

g = a > b ? a : b; 

. C11-§6.5.16/2: Un operatore di assegnazione deve avere un lvalue modificabile come suo operando di sinistra.
. §6.3.2.1/1: Un lvalue è un'espressione (con un tipo di oggetto diverso da void) che potenzialmente designa un oggetto; 64) se un lvalue non designa un oggetto quando viene valutato, il comportamento non è definito. Quando si dice che un oggetto ha un particolare tipo, il tipo è specificato dal lvalue usato per designare l'oggetto. Un lvalue modificabile è un lvalue che non ha un tipo di array, non ha un tipo incompleto, non ha un tipo const-qualified, e se è una struttura o unione, non ha alcun membro (incluso, in modo ricorsivo, qualsiasi membro o elemento di tutti gli aggregati o sindacati contenuti) con un tipo con certificato costante.

+0

Puoi spiegare la tua frase: -" L'operando di sinistra di = operator deve essere un lvalue (modificabile)." – sgewraks

+0

@sam; Aggiunti alcuni dettagli su" lvalue "e" "lvalue modificabile". – haccks

0
  • Basta sostituire il vostro:

    a > b ? g = a : g = b ; 
    

    con

    a > b ? (g = a) : (g = b) ; 
    
  • Perché precedance di parentesi è higher.So se la condizione a > b è diventato vero, allora il valore di A è assegnato a g e se fallisce allora il valore di b è assegnato a g.