Warum verwenden wir hier int&?
-
Aufgabe:
Ich soll eine Funktion iteration mit den Parameter x, n und , die für diese Folge das erste n mit bestimmt. Die Funktion soll als Ergebnis liefern und den Wert von n im gleichnamigen Parameter ablegen.Lösungsvorschlag sieht so aus:
double iteration(double x, int& n, double s)
{
n = 0;
do {
x = x/(1+sqrt(1+x));
n++;
} while (x s)
return x;
}Meine Frage ist, was ist hier diese gleichnamig Parameter gemeint nämlich "int&", wofür brauchen wir das und nicht einfach "int"?
Eine neue Frage: wieso nutzen wir do{...}while(...) statt while(...), kann jemanden anhand dieses Beispiel kurz erklären?
Vielen Dank im Voraus!
-
int& steht für eine Referenz auf eine Integer Variable.
In deinem Fall sorgt es dafür, dass die Funktion quasi einen zweiten Rückgabewert besitzt. Durch die Referenz als Argument wird es dem Aufrufer ermöglicht den letzten Wert von n in der Funktion zu kennnen.Vom Stil her finde ich das sehr unglücklich, da ein Argument zweckentfremdet wird.
Schöner liese sich das mit std::pair umsetzten. Dann sähe die Funktion so aus:std::pair<double, int> iteration(double x, double s) { int n = 0; do { x = x/(1+sqrt(1+x)); n++; } while (x>s); return {x,n}; }
-
@axels Danke für die Antwort und Verbesserung!
Ich verstehe leider nicht, woher kennst du, dass diese Funktion zweite Rückgabewert besitzt, ich merke nur return x. Und was wäre der Fall, wenn ich diese "&" lösche?
-
@Malik sagte in Warum verwenden wir hier int&?:
Und was wäre der Fall, wenn ich diese "&" lösche?
void f(int a, int& b) { a = 99; b = 99; } int main() { int x = 42; int y = 42; f(x,y); std::cout << x << ", " << y; // Ausgabe: 42, 99
-
@Malik sagte in Warum verwenden wir hier int&?:
Ich verstehe leider nicht, woher kennst du, dass diese Funktion zweite Rückgabewert besitzt,
Das ist der (eine) Zweck einer Referenz.
Und es steht ja auch in der Aufgabe:
@Malik sagte in Warum verwenden wir hier int&?:die für diese Folge das erste n mit ... bestimmt.
Du sollst auch das n ermitteln.
-
@DirkB ach, das habe ich irgendwie ignoriert. Danke!
-
@Jockelx Danke für dem Beispiel!
-
@axels sagte in Warum verwenden wir hier int&?:
Vom Stil her finde ich das sehr unglücklich, da ein Argument zweckentfremdet wird.
Schöner liese sich das mit std::pair umsetzten. Dann sähe die Funktion so aus:std::pair<double, int> iteration(double x, double s)
So am Rande sollte vielleicht noch erwähnt sein, dass sich eine solche Funktion ab C++17 auch sehr kompakt aufrufen lässt:
auto [x, n] = iteration(x0, s);
Im aufrufenden Code ist danach
x
eindouble
undn
einint
mit den entsprechenden Rückgbewerten der Funktion. Mit diesen Variablen kann man dann ganz normal weiterarbeiten.