2009-04-27 15 views
47
int qempty() 
{ 
    return (f == r ? 1 : 0); 
} 

In dem obigen Snippet, was bedeutet "?"? Wo können wir es ersetzen?Was bedeutet "?" in C++ machen?

+21

In diesem speziellen Fall natürlich, man kann es nur ersetzen mit Rück f == r; – Eclipse

+24

In Kommentaren wird es verwendet, um eine Frage zu stellen. –

+6

@Eclipse: Ich würde mich nicht auf eine implizite Konvertierung bool-> int verlassen, wenn ich es vermeiden kann. –

Antwort

86

Dies wird gemeinhin als die conditional operator, und wenn so benutzt:

condition ? result_if_true : result_if_false 

... wenn die condition zu true auswertet, der Ausdruck result_if_true auswertet, ansonsten wertet es result_if_false.

Es ist syntactic sugar, und in diesem Fall kann es mit

int qempty() 
{ 
    if(f == r) 
    { 
     return 1; 
    } 
    else 
    { 
     return 0; 
    } 
} 

Hinweis ersetzt: Einige Leute zu ?: es als „der ternäre Operator“ beziehen sich, weil es der einzige ternäre ist Operator (dh Operator, der drei Argumente annimmt) in der Sprache, die sie verwenden.

+0

Ich denke, sie bedeuten implizit "der (C++) ternäre Operator". Welche anderen ternären Operatoren gibt es in C++? – sblom

+0

Das ist das einzige in C++ – Colin

+0

Für jeden, der bedingte Liebe braucht: http://www.artima.com/cppsource/foreach.html. Eric Niebler erklärt, wie sein boost.foreach den bedingten Operator verwendet. –

3

Es ist der bedingte Operator.

a? b: c

Es ist eine Abkürzung für IF/THEN/ELSE.

bedeutet: wenn a wahr ist, return b, sonst zurück c. In diesem Fall, wenn f == r, return 1, sonst Rückkehr 0.

14

Dies ist ein ternärer Operator, es ist im Grunde ein Inline-if-Anweisung

x ? y : z 

Werke wie

if(x) y else z 

außer , anstelle von Aussagen haben Sie Ausdrücke; Sie können es also in der Mitte einer komplexeren Anweisung verwenden.

Es ist nützlich, um prägnanten Code zu schreiben, aber kann überstrapaziert werden, um schwer zu wartenden Code zu erstellen.

+4

Sie müssen hier vorsichtig sein; Es funktioniert nicht genau wie eine if-Anweisung. Während du * etwas sagen kannst wie int 'a = x? y: z; 'du * kannst * nicht sagen' int a = wenn (x) y else z; ' –

+3

es sich lohnt zu wissen, dass es einen Sequenzpunkt am '?' gibt. Das bedeutet, dass Folgendes gilt: ++ x? x: y; –

+1

@Daniel, das meinte ich mit Ausdrücken und nicht mit Aussagen. Ich war wahrscheinlich nicht explizit genug über den Unterschied, also danke, dass ich etwas geklärt habe. – Richard

2

Das Fragezeichen ist der Bedingungsoperator. Der Code bedeutet, dass wenn f == dann r 1 zurückgegeben, ansonsten Rückgabe von 0. Der Code als

neu geschrieben werden kann
int qempty() 
{ 
    if(f==r) 
    return 1; 
    else 
    return 0; 
} 

das ist wahrscheinlich nicht der sauberste Weg, es zu tun, aber hoffentlich hilft Ihr Verständnis.

5

können Sie einfach umschreiben als:

int qempty(){ return(f==r);} 

was dasselbe tut wie in den anderen Antworten gesagt.

+0

Dies würde implizite Konvertierung von Boolean zu Int – mmcrae

2

Nur eine Notiz, wenn Sie jemals sehen:

a = x ? : y; 

Auf den Standard eine GNU-Erweiterung ist (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals).

Es ist die gleiche wie

a = x ? x : y; 
+0

in CLang durchführen (mindestens die neuesten Versionen) diese Erweiterung ist ebenfalls verfügbar. Es ist sogar verfügbar, wenn C++ 11-Flag in einem qmake-Projekt deaktiviert ist. Also ein Ausdruck wie int 'x = 1 + 1? : 0 '; gibt korrekt '2' in meinem Compiler zurück und das hat nichts geklaert. –