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)

53voto

Justin Ethier Punkte 126797

Nach Angaben der C FAQ :

Die Bedeutung des Komma-Operators im allgemeinen Ausdruck ist genau genommen

e1 , e2

ist "evaluiere den Unterausdruck e1, dann evaluiere e2; der Wert des Ausdrucks ist der Wert von e2". Daher sollte e1 besser eine Zuweisung oder ein Inkrement ++ oder Dekrement -- oder einen Funktionsaufruf oder eine andere Art von Nebeneffekt beinhalten, da sonst ein Wert berechnet würde, der verworfen würde.

Ich stimme also mit Ihnen überein, Es gibt keinen Grund außer um zu zeigen, dass dies eine gültige Syntax ist, wenn überhaupt.

Wenn Sie beide Werte in C oder C++ zurückgeben wollten, könnten Sie eine struct mit x y y Mitglieder, und geben Sie stattdessen die Struktur zurück:

struct point {int x; int y;};

Sie können dann einen Typ und eine Hilfsfunktion definieren, die es Ihnen ermöglichen, beide Werte einfach innerhalb der struct :

typedef struct point Point;

Point point(int xx, int yy){
  Point p;
  p.x = xx;
  p.y = yy;
  return p;
}

Ändern Sie dann Ihren ursprünglichen Code, um die Hilfsfunktion zu verwenden:

Point foo(){
  int x=0;
  int y=20;
  return point(x,y); // x and y are both returned
}

Und schließlich können Sie es ausprobieren:

Point p = foo();
printf("%d, %d\n", p.x, p.y);

Dieses Beispiel lässt sich sowohl in C als auch in C++ kompilieren. Obwohl, wie Mark unten vorschlägt, kann man in C++ einen Konstruktor für die point Struktur, die eine elegantere Lösung bietet.


Nebenbei bemerkt, ist die Möglichkeit, mehrere Werte direkt zurückzugeben, in Sprachen wie Python, die dies unterstützen, wunderbar:

def foo():
  x = 0
  y = 20
  return x,y # Returns a tuple containing both x and y

>>> foo()
(0, 20)

23voto

Das Komma in Parameterlisten dient nur dazu, die Parameter zu trennen, und ist nicht dasselbe wie der Komma-Operator. Der Komma-Operator, wie in Ihrem Beispiel, wertet sowohl x als auch y aus und verwirft dann x.

In diesem Fall würde ich vermuten, dass es sich um einen Fehler von jemandem handelt, der versucht, zwei Werte zurückzugeben, und nicht weiß, wie er das machen soll.

20voto

Joel Punkte 5588

Der Komma-Operator wird hauptsächlich verwendet in for Aussagen wie diese:

for( int i=0, j=10; i<10; i++, j++ )
{
    a[i] = b[j];
}

Das erste Komma ist kein Kommaoperator, sondern Teil der Deklarationssyntax. Das zweite es ein Komma-Operator.

9voto

jcoder Punkte 28716

Dies beantwortet die ursprüngliche Frage nicht wirklich, könnte aber für einige Leute von Interesse sein, aber wenn Sie wollten, dass beides in C++ zurückgegeben wird, müssten Sie es wie folgt schreiben (und bräuchten einen C++0x-Compiler)

tuple<int, int> foo()
{
    int x = 0;
    int y = 20;
    return make_tuple(x, y);
}

Der Zugang ist wie folgt -

tuple<int, int> data = foo();
int a = get<0>(data);
int b = get<1>(data);

8voto

kennytm Punkte 488916
 struct Point {
   int x, y;
   Point(int x_) : x(x_), y(0) {}
   Point(const Point& p) : x(p.x), y(p.y) {}
   Point operator, (int y_) const { Point p=*this; p.y = y_; return p; }
 };

 Point get_the_point () {
    int x = 0;
    int y = 20;
    return (Point)x, y;
 }

:p

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