2015-07-24 20 views
8

Considerate questa funzioneChe cosa significa questo? operatore in C++ fare?

template<class T> inline bool cx(T &a, T b) {return a < b ? a = b, 1 : 0;} 

Qualcuno può spiegare che cosa è esattamente questo che fa? Sembra diverso dal tipico formato condition ? true : false.

+5

È * la * condizione tipica? true: false' – juanchopanza

+0

Quindi non capisco quale pezzo è cosa, perché quello che vedo è 'condizione? condition, true: false' –

+8

Quindi dovresti chiedere cosa significa 'a = b, 1 '. O come viene analizzata la cosa completa, tenendo conto della precedenza degli operatori.Ma è un'espressione condizionale standard. Il codice sembra essere scritto per confondere però. – juanchopanza

risposta

9

Potremmo renderlo più chiaro in questo modo:

return a < b ? (a = b, 1) : 0; 

Il bit tra parentesi significa "assegnare b-a, quindi utilizzare 1 come il nostro valore".

Comma-separated lists of values in C e C++ generalmente significa "valuta tutti questi, ma usa l'ultimo come valore dell'espressione".

+0

Non sapevo che potessi combinare le istruzioni con virgole come questa in C++ (ho sempre pensato che le cose dovessero essere separate dal punto e virgola). –

+0

@ArukaJ Quelli sono principalmente espressioni. L'istruzione è 'return ;'. – juanchopanza

+0

@ArukaJ Non è possibile combinare _statements_ con virgole, solo _expressions_. – celticminstrel

0

a < b ? a = b, 1 : 0 viene analizzato come (a < b) ? (a = b, 1) : 0, un normale operatore condizionale. Quando a < b vale, a = b, 1 viene valutata assegnando b a a e poi "ritorno" 1. L'effetto netto di cx(a,b) è quindi assegnare il valore maggiore per a e restituire 1 se a cambiato, 0 altrimenti.

4

Questa combinazione è un po 'complicata, perché combina un comma operator con l'espressione condizionale. Analizza come segue:

  • a < b è la condizione,
  • a = b, 1 è il "quando vera" espressione
  • 0 è il "quando false" espressione

Il risultato dell'operatore virgola è il suo ultimo componente, ovvero 1. L'obiettivo di utilizzare l'operatore virgola in primo luogo è di causare l'effetto collaterale dell'assegnazione di b a a.

1

Leggetelo come:

if (a < b) 
{ 
    a = b; 
    return (1); 
} 
else 
{ 
    return (0); 
} 
3

L'operatore , solo valuta le tutte le espressioni, da sinistra a destra, e restituisce il valore dell'espressione più a destra.

Il codice è lo stesso ...

if (a < b) 
{ 
    a = b; 
    return 1; 
} 
else 
{ 
    return 0; 
} 
+0

... e non verrà compilato. –

+1

@juanchopanza Questo codice equivale a 'return a QuestionC

+0

@QuestionC Giusto abbastanza. – juanchopanza

3

È possibile eseguire diversi espressione utilizzando ,

In questo caso se un < b, quindi assegnare b per una e ritornare 1. Secondo C++ grammatica:

conditional-expression: 
    logical-or-expression 
| logical-or-expression ? expression : assignment-expression 

dove

expression: 
    assignment-expression 
| expression , assignment-expression 

assignment-expression: 
    conditional-expression 
| logical-or-expression assignment-operator initializer-clause 
| throw-expression