48 Stimmen

C++ -- return x,y; Was soll das bringen?

Ich programmiere schon seit ein paar Jahren in C und C++ und nehme jetzt gerade an einem College-Kurs teil, und in unserem Buch gab es eine Funktion wie diese als Beispiel:

int foo(){
  int x=0;
  int y=20;
  return x,y; //y is always returned
}

Eine solche Syntax habe ich noch nie gesehen. In der Tat habe ich noch nie die , Operator außerhalb von Parameterlisten verwendet. Wenn y immer zurückgegeben wird, was ist dann der Sinn? Gibt es einen Fall, in dem eine Return-Anweisung auf diese Weise erstellt werden muss?

(Außerdem habe ich auch C markiert, weil es für beide gilt, obwohl mein Buch speziell C++ ist)

0voto

Karl Bielefeldt Punkte 45032

Das Buch versucht, mögliche Verwirrungen von Leuten zu beseitigen, die vor C++ andere Sprachen gelernt haben. In vielen Sprachen kann man mit einer ähnlichen Syntax mehrere Werte zurückgeben. In C++ wird dies ohne Warnung kompiliert (es sei denn, Sie geben -Wall o -Wunused-value ), aber es wird nicht so funktionieren, wie Sie es vielleicht erwarten, wenn Sie an diese anderen Sprachen gewöhnt sind. Es wird einfach der letzte Wert zurückgegeben.

Es scheint jedoch, dass der Autor mehr Verwirrung gestiftet als verhindert hat, da es keine lesbare Situation gibt, in der eine solche Syntax in einer Return-Anweisung in C++ verwendet werden kann, es sei denn, man verwendet sie versehentlich wie eine andere Sprache. Er warnt vor einer Verwendung, die den meisten Leuten nicht in den Sinn käme, zu versuchen. Wenn Sie es dennoch täten, wäre es äußerst verwirrend bei der Fehlersuche, da die Mehrfachzuweisungsanweisung int x, y = foo() kompiliert ebenfalls einwandfrei.

Fazit: Verwenden Sie immer -Wall und beheben Sie die Fehler, vor denen es Sie warnt. Die C++-Syntax erlaubt es Ihnen, viele Dinge zu schreiben, die keinen Sinn ergeben.

0voto

magnus Punkte 3571

Bei Verwendung mit dem return Schlüsselwort, gibt der Komma-Operator die zuletzt Wert, der zunächst verwirrend aber kann Dinge machen prägnanter .

Das folgende Programm wird zum Beispiel mit einem Statuscode von 2 beendet.

#include <iostream>
using namespace std;

void a() {
    cout << "a" << endl;
}

int one() {
    cout << "one" << endl;
    return 1;
}

int zero() {
    cout << "zero" << endl;
    return 0;
}

int main() {
    return one(), a(), zero(), 2;
}

Beim Kompilieren und Ausführen mit dem folgenden Befehl erhalten Sie die unten stehende Ausgabe.

michael$ g++ main.cpp -o main.out && ./main.out ; echo $?
one
a
zero
2

0voto

DaveFar Punkte 6589

Wenn aber immer y zurückgegeben wird, was ist dann der Sinn?

Der Punkt ist die Nebenwirkung von x (d.h. der linken Seite des Kommaoperators). Siehe z. B. die Antwort von Justin Ethier für weitere Einzelheiten.

Gibt es einen Fall, in dem eine Return-Anweisung wie diese erstellt werden muss?

Ein Beispiel ist eine constexpr-Funktion in C++11 bis C++14: eine solche Funktion darf keine beliebigen Anweisungen enthalten, sondern genau eine Return-Anweisung.

Hier ist ein Codebeispiel aus Patrice Roys "Die Ausnahmesituation" auf der CppCon 2016 :

constexpr int integral_div(int num, int denom) {
    return assert(denom != 0), num / denom;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X