Was macht '?' in C ++ tun?

80
int qempty()
{
    return (f == r ? 1 : 0);
}

Was bedeutet " ? " Im obigen Ausschnitt ? Womit können wir es ersetzen?

Thaier Alkhateeb
quelle
22
In diesem speziellen Fall können Sie es natürlich einfach durch return f == r ersetzen.
Eclipse
27
In Kommentaren wird es verwendet, um eine Frage zu stellen.
Mehrdad Afshari
6
@Eclipse: Ich würde mich nicht auf eine implizite Konvertierung verlassen, bool-> int, wenn ich das vermeiden könnte.
Daniel Daranas
2
@ DanielDaranas warum nicht? (Dies ist eine Art Anfängerfrage - eine Erklärung Ihrer Kommentare für Anfänger wäre sehr hilfreich und würde geschätzt.)
Michael Hoffmann
4
@MichaelHoffmann Das Verhalten der impliziten Konvertierung ist in diesem Fall genau definiert, daher ist die Verwendung vollkommen korrekt. In dieser Antwort finden Sie einen Verweis auf den Standard. Persönlich vermeide ich implizite Typkonvertierungen, da ich denke, dass der Code besser lesbar und wartbar ist und ohne sie weniger fehleranfällig ist. Ich habe in diesem Blog-Beitrag ausführlicher darüber geschrieben .
Daniel Daranas

Antworten:

131

Dies wird allgemein als bedingter Operator bezeichnet , und wenn er wie folgt verwendet wird:

condition ? result_if_true : result_if_false

... wenn das conditionausgewertet wird, truewird der Ausdruck ausgewertet result_if_true, andernfalls wird er ausgewertet result_if_false.

Es ist syntaktischer Zucker und kann in diesem Fall durch ersetzt werden

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

Hinweis: Einige Leute bezeichnen ?:es als " den ternären Operator ", da es der einzige ternäre Operator (dh der Operator, der drei Argumente akzeptiert) in der Sprache ist, die sie verwenden.

Daniel LeCheminant
quelle
Ich denke, sie bedeuten implizit "den (C ++) ternären Operator". Welche anderen ternären Operatoren gibt es in C ++?
sblom
Für alle, die bedingte Liebe brauchen: artima.com/cppsource/foreach.html . eric niebler erklärt, wie sein boost.foreach den bedingten Operator verwendet.
Johannes Schaub - litb
4
Im regulären Code ist es syntaktischer Zucker, aber Sie können damit eine bedingte Initialisierung in der Initialisierungsliste des Konstrukts durchführen.
JohnMcG
@ JohnMcG warte, was? Könnten Sie ein Beispiel geben?
Tim Snowhite
1
Wahrscheinlich, aber die Frage, Antwort und der Kommentar wurden 2009 geschrieben.
JohnMcG
15

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

x ? y : z

funktioniert wie

if(x) y else z

außer, dass Sie anstelle von Anweisungen Ausdrücke haben; Sie können es also mitten in einer komplexeren Anweisung verwenden.

Es ist nützlich, um prägnanten Code zu schreiben, kann jedoch überbeansprucht werden, um schwer zu pflegenden Code zu erstellen.

Richard
quelle
4
Hier muss man vorsichtig sein; Es funktioniert nicht genau wie eine if-Anweisung. Während Sie etwas wie int sagen können , könnena = x ? y : z; Sie nicht sagenint a = if(x) y else z;
Daniel LeCheminant
4
Es lohnt sich zu wissen, dass es am '?' einen Sequenzpunkt gibt. Das heißt, Folgendes ist gültig: ++ x? x: y;
Johannes Schaub - litb
1
@ Daniel, das habe ich mit Ausdrücken statt Aussagen gemeint. Ich war wahrscheinlich nicht explizit genug über den Unterschied, also danke für die Klarstellung.
Richard
6

Sie können es einfach umschreiben als:

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

Welches macht das gleiche wie in den anderen Antworten gesagt.


quelle
Dies würde eine implizite Konvertierung von Boolean nach Int
Don Cheadle
6

Nur eine Anmerkung, falls Sie dies jemals sehen:

a = x ? : y;

Es ist eine GNU-Erweiterung des Standards (siehe https://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals ).

Es ist das gleiche wie

a = x ? x : y;
Nick Kossifidis
quelle
In CLang (zumindest den neuesten Versionen) ist diese Erweiterung ebenfalls verfügbar. Es ist auch verfügbar, wenn das C ++ 11-Flag in einem qmake-Projekt deaktiviert ist. Also ein Ausdruck wie int x = 1+1 ? : 0 ; kehrt korrekt zurück 2 , in meinem Compiler und das hat nichts beanstandet.
Vinícius A. Jorge
3

Es ist der bedingte Operator.

ein ? b: c

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

bedeutet: Wenn a wahr ist, geben Sie b zurück, andernfalls geben Sie c zurück. In diesem Fall, wenn f == r, 1 zurückgeben, andernfalls 0 zurückgeben.

Joe
quelle
2

Das Fragezeichen ist der bedingte Operator. Der Code bedeutet, dass wenn f == r, dann 1 zurückgegeben wird, andernfalls 0 zurückgegeben wird. Der Code könnte wie folgt umgeschrieben werden

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

Das ist wahrscheinlich nicht der sauberste Weg, aber hoffentlich hilft es Ihrem Verständnis.

ssakl
quelle