Gibt es einen Unterschied zwischen diesen beiden Anweisungen innerhalb einer Funktion?
bool returnValue = true;
// Code that does something
return(returnValue);
und das?
bool returnValue = true;
// Code
return returnValue;
Ersteres hat Klammern returnValue
.
c++
/c
. Es wäre gut, die Sprachdefinition genauer zu definieren, aber ich weiß nicht, wie ich das 9 Jahre später beheben kann.C
es gibt ein Duplikat stackoverflow.com/questions/161879/…Antworten:
Ab C ++ 14 sind sie häufig.
C ++ 14 fügt einen Randfall hinzu, in dem Klammern um einen Rückgabewert die Semantik ändern können. Dieses Code-Snippet zeigt zwei deklarierte Funktionen. Der einzige Unterschied besteht in Klammern um den Rückgabewert.
int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
In der ersten
func1
gibt einint
und in der zweiten einefunc1
zurückint&
. Der Unterschied in der Semantik hängt direkt mit den umgebenden Klammern zusammen .Der
auto
Bezeichner in seiner neuesten Form wurde in C ++ 11 eingeführt. In der C ++ - Sprachspezifikation wird Folgendes beschrieben:Außerdem hat C ++ 11 den
decltype
Spezifizierer eingeführt, der in der C ++ - Sprachspezifikation beschrieben ist :In C ++ 14 war die Verwendung
decltype(auto)
für Funktionsrückgabetypen zulässig. In den Originalbeispielen kommt der semantische Unterschied zu Klammern ins Spiel. Wiederholung der ursprünglichen Beispiele:int var1 = 42; decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1) decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))
decltype(auto)
Ermöglicht die Ableitung des nachfolgenden Rückgabetyps in der Funktion aus der Entität / dem Ausdruck in der return-Anweisung. In der ersten Versionreturn var1;
ist dies effektiv dasselbe wie die Rückgabe des Typsdecltype(var1)
(einint
Rückgabetyp gemäß Regel 1 oben) und im zweiten Fall istreturn (var1);
es effektiv dasselbe wiedecltype((var1))
(einint &
Rückgabetyp gemäß Regel 2b).Die Klammern geben den Rückgabetyp
int&
anstelle von anint
, wodurch sich die Semantik ändert. Moral der Geschichte - "Nicht alle Klammern eines Rückgabetyps sind gleich"quelle
return (x);
gleichwertig seinreturn &x;
und auch nicht zu einer Rückgabe von führen der Wert von x, aber mit dem Typverweis auf x.auto
ziemlich oft. Ändert sich unsere Semantik nie, solange wir uns fernhaltendecltype
? Ich habe Angst vor unerwartetem Verhalten, wenn wir zur nächsten Compilerversion übergehen, die das nächste Visual Studio enthält.Es gibt keinen Unterschied.
Ein Grund für die Verwendung von Klammern wäre, wenn Sie einen Ausdruck vor der Rückkehr auswerten möchten, in Ihrem Beispiel jedoch keinen Grund. Sehen:
Klammer um Rückgabewerte
zur weiteren Diskussion.
quelle
return m * x + c
undreturn (m * x + c)
oderreturn ( (m * x) + c )
oder usw. - und es sieht auch nicht besser oder intuitiver aus, wenn Sie mich fragen.Die Klammern im oberen Beispiel sind überflüssig; Sie werden effektiv ignoriert.
Es wäre das gleiche wie so etwas wie ...
int x = (5);
Die Klammern hier werden ebenfalls ignoriert.
quelle
AFAIK, nichts ist anders.
In C ++ können Ausdrücke die Form haben:
expr
oder(expr)
. Letzteres ist also ein Ausdruck mit mehr Typisierung. Weitere Informationen hierzu finden Sie in einer Grammatik (suchen Sie nach "Ausdruck").quelle
Nein, es gibt keinen Unterschied in Ihrem Code.
quelle
Ich nehme an, es
boo
ist ein Tippfehler, und Sie fragen, ob es einen Unterschied zwischen gibtreturn expr;
und
return(expr);
Die Antwort ist nein.
quelle
Kein Unterschied!!
Menschen verwenden Klammern, wenn es sich um einen komplexen Ausdruck handelt.
Übrigens
return
ist eine Aussage keine Funktion.quelle
Nein, es gibt keinen Unterschied zwischen den beiden, obwohl Sie Klammern einfügen können, wenn der Ausdruck dadurch leicht lesbar und klar ist.
quelle
return
es sich um einen gierigen Operator handelt, der den Restreturn m * x + c
zurückgebenm
und wegwerfen könnte , oder was?Sie verlangsamen den Compiler missbräuchlich!
Das Vorhandensein von Klammern verlangsamt nicht nur die Vorverarbeitungsphase, sondern erzeugt auch einen komplizierteren abstrakten Syntaxbaum: mehr Speicher, mehr Berechnung.
Aus semantischer Sicht? Sie sind genau identisch. Unabhängig davon, ob Klammern vorhanden sind oder nicht
return
, wird der Ausdruck in der Anweisung vollständig ausgewertet, bevor er zurückgegeben wird.quelle
Sie sind identisch. Ich sehe die Syntax in Klammern ziemlich oft und frage immer diejenigen, die sie verwenden: warum ? Und niemand kann antworten, warum sie es benutzen.
Um es auf den Punkt zu bringen: Klammern um zurückkehrende Ausdrücke werden von Personen verwendet, die den Unterschied zwischen funktionsähnlichen Makros und Funktionen nicht ganz verstehen oder die über die Priorität des Operators oder die Reihenfolge der Bewertungsregeln in C verwirrt sind. Es gibt keine Codierung Stil profitieren von der Verwendung von Klammern.
So
return value;
ist korrekter als
return (value)
weil letzteres darauf hindeutet, dass Sie nicht genau wissen, was Sie tun :)
quelle
Beide sind in Ihrem Fall gleich.
quelle
a
ist5
dannreturn a++;
undreturn (a++);
(was das gleiche ist) werden beide zurückkehren5