2013-02-10 14 views
11

K & R Seconda edizione (pagina 71) - devo aver perso la spiegazione:domanda operatore segno nelle espressioni

sign = (s[i] == '-') ? -1 : 1; 

Il contesto di questo è una funzione che converte una stringa in un doppio. Questa parte in particolare viene dopo che la funzione salta lo spazio bianco. I dedurre è controllando valore positivo o negativo, e salvarla sia come -1 o +1 per conversione segno alla fine della funzione ... return sign * val /power;

desidero fare meglio di dedurre. .. Sono particolarmente sicuro di ciò che stanno facendo il ? e : 1 qui (o ovunque, per quella materia).

Questo tipo di assomiglia ad una dichiarazione astratta if. Dove ? verifica la verità e : è else ... è così? È limitato a if/else?

io sono un principiante e non ho incontrato questa sintassi espressione prima, quindi mi chiedo se c'è un motivo particolare sembra essere spesso sostituito da un formale if/else --besides, forse, la leggibilità?

risposta

12

E 'sorta di sembra un astratto if.

Questo è corretto. Questo è chiamato "operatore condizionale ternario".

I normali if opere dichiarazioni, mentre l'operatore condizionale funziona su espressioni.


Mi chiedo se c'è un motivo particolare, sembra essere spesso sostituito da un formale if/else - oltre, forse, la leggibilità?

Ci sono casi in cui la ramificazione su istruzioni non è sufficiente, ed è necessario lavorare sul livello di espressione.

Ad esempio, si consideri l'inizializzazione:

const int foo = bar ? 5 : 3; 

questo non poteva essere scritta utilizzando un normale if/else.


In ogni caso, le persone che dicono che è equivalente al if/else sono essendo impreciso. Mentre l'assembly generato è solitamente lo stesso, non sono equivalenti e non dovrebbero essere visti come una versione abbreviata di if. In poche parole, utilizzare if quando possibile e utilizzare l'operatore condizionale solo quando è necessario eseguire il branching sulle espressioni.

+0

Scelto come risposta perché hai affrontato il perché, così come il cosa. – d0rmLife

2

Questo è l'operatore ternario. (s[i] == '-') ? -1 : 1; restituisce -1 se s[i] == '-' e 1 in caso contrario. Questo valore viene quindi assegnato a sign. In altre parole, un modo più tempo per scrivere questo sarebbe:

int sign; 

if(s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
+0

"L'operatore ternario" non è completamente corretto, il suo nome corretto è "l'operatore condizionale". –

0
sign = (s[i] == '-') ? -1 : 1; 

è una scorciatoia per:

if (s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
1

?: è la operatore condizionale in C.

Nella tua esempio produrrebbe lo stesso risultato di questa istruzione if:

if (s[i] == '-') 
{ 
    sign = -1; 
} 
else 
{ 
    sign = 1; 
} 
12

E 'sorta di sembra un astratto if, dove ? controlli per la verità e : è altra cosa ... E' così?

Sì, quasi. Si chiama "operatore condizionale" (a volte non definito con precisione come "l'operatore ternario", poiché è l'unico operatore ternario in C). Non è una dichiarazione , tuttavia è un'espressione , ha un valore. Valuta il suo secondo argomento se il primo argomento restituisce true e il terzo argomento se è falso. Pertanto

sign = (s[i] == '-') ? -1 : 1; 

è equivalente a

if (s[i] == '-') { 
    sign = -1; 
} else { 
    sign = 1; 
} 
+0

+1 per disponibilità. Questa risposta spiega davvero come viene interpretato "l'operatore condizionale". Grazie. – d0rmLife

Problemi correlati