Hilfe bei Programm
-
Hi,
ich sitze gerade an einer Klausuraufgabe, aber bekomme verstehe da eine Codezeile nicht genau! Hier der Code:#include <iostream> using namespace std; void test1 (int & vi) {vi = vi*vi;} void test2 (int vi) {vi = vi*vi;} int main() { int vi = 2; test1(vi); cout << "vi nach test1:" << vi << endl; test2(vi); cout << "vi nach test2:" << vi << endl; return 0; }Und zwar was bedeutet denn das & in Unterprogramm test1 ?
Das beim Aufruf von test2 für vi 4 rauskommt, das verstehe ich ja.
Wäre cool, wenn mir jemand helfen könnte!Gruß Torti
-
Torti85 schrieb:
ich sitze gerade an einer Klausuraufgabe, aber bekomme verstehe da eine Codezeile nicht genau! Hier der Code:
So wie der Formatiert ist würde ich auch erstmal stutzen...
#include <iostream> using namespace std; void test1(int & vi) { vi = vi*vi; } void test2(int vi) { vi = vi*vi; } int main() { int vi = 2; test1(vi); cout << "vi nach test1:" << vi << endl; test2(vi); cout << "vi nach test2:" << vi << endl; return 0; }Torti85 schrieb:
Und zwar was bedeutet denn das & in Unterprogramm test1 ?
Das ist eine Referenz.
test1 arbeitet mit "Call-by-Reference", test2 mit "Call-by-Value".
Was bedeutet das?
Also erstmal Call-by-Value: Bei Call-by-Value wird der Parameter kopiert, ist also eine eigene Variable, die nichts mit dem Aufrufer gemein hat.
Bei Call-by-Reference: Bei Call-by-Reference ist der Parameter eine Referenz, was bedeutet das er nur ein Aliasname für den aufgerufenen Wert darstellt. Alle Änderungen an einer Referenz ändern auch den zugrundeliegenden Wert.cu André
-
Ausgabe in dem Fall:
vi nach test1:4 vi nach test2:4
-
Danke schön erster einmal!
Aber was heisste den: "ändern den zugrundeliegenden Wert" ?@Dave_R:
Danke! Aber hab es auch schon compilen gelassen
-
Torti85 schrieb:
Danke schön erster einmal!
Aber was heisste den: "ändern den zugrundeliegenden Wert" ?Denk mal nach:
test1(vi); // <-- hier wird vi geändert (da Call-By-Reference) test2(vi); // <-- hier wird vi nicht geändert (da Call-By-Value)cu André
-
Das Ganze wird übersichtlicher wenn man die Variable die bei Call-by-Value übergeben wird im Unterprogramm anders benennt. Bei Call-by-Value wird nämlich (wie asc schon sagte) eine neue Variable angelegt, mit der das Unterprogramm arbeitet. Diese (temporäre) Variable bekommt als Inhalt den Inhalt der übergebenen Variable und wird wieder gelöscht, wenn das Unterprogramm verlassen wird!!!
Bei Call-by-Reference dagegen verändert das Unterprogramm direkt den Inhalt der übergebenen Variablen.
Daher ist der Quellcode vielleicht so besser verständlich:#include <iostream> using namespace std; void test1(int & vi) { vi = vi*vi; } void test2(int viTemp) // hier wird bei Aufruf eine neue Variable viTemp (war vorher vi) // angelegt und der Inhalt der übergebenen Variablen eingetragen, // es wird also nur die temporäre Variable verändert und nicht vi // aus dem Hauptprogramm { viTemp = viTemp*viTemp; } int main() { int vi = 2; test1(vi); cout << "vi nach test1:" << vi << endl; test2(vi); cout << "vi nach test2:" << vi << endl; return 0; }
-
Ahh eben hab ich es verstanden!
Danke nochmal für die Hilfe!Gruß Torti