C++ Frage zu Programmschnippsel

H

hobbicon

Gast
Hallo,

hätte eine kurze Frage zu folgendem Programmschnippsel:

6256819Capture.PNG


Rauskommen soll:

4

bzw.

1 2


Ich sehe das so:

Funktion wird definiert mit int i und Adresse vom int j.
Der Rückgabewert entspricht der Summe von i und j, die jeweils um 1 erhöht wurden.

i und j werden zu 1 gesetzt.
Dann in der Funktion verwurstet und 2 + 2 = 4.

Aber warum wird dann 1 bzw. 2 ausgegeben?
 
i wird als Kopie übergeben, j als Referenz.

Kopie = wird nur innerhalb der Funktion verändert
Referenz/Zeiger = wird direkt übergeben, gilt somit auch außerhalb der Funktion

wertvoll( 1, 1 ) wird aufgerufen:
  • in der Funktion werden i und j um 1 inkrementiert, bevor die Operation durchgeführt wird (Präinkrement)
  • zurückgegeben wird also 4 (2 + 2)
  • i ist eine Kopie, gilt also nur innerhalb der Funktion; j ist eine Referenz, es wird also direkt mit der übergebenen Variablen gearbeitet
Sprung aus wertvoll():
  • i ist immer noch 1, da eine Kopie übergeben wurde, j ist nun 2, da es als Referenz übergeben und innerhalb wertvoll() verändert wurde

Deshalb die Ausgabe 1 2.
 
Weil das "verwursten" halt doch nicht so primitiv ist.

Ich übersetze "verwursten" mit "irgendwie komisch hinmachen". Etwas mehr Logik ist es dan nschon ;)


i wird als Kopie übergeben, auf j die referenz. Schlag mal nach unter Gültigkeitsbereich und Funktionsparameter ;)

Du wärst noch verwirrter wenn er rechts j++ gemacht und eine Klammer geschickt positionert hätte. Gute Übungsaufgabe! :D
 
Die lange Antwort kam schon von Yuuri.

Die kurze Antwort:

Code:
  int wertvoll( int i, int& j );
  ...
  a = 1;  b = 1;
  wertvoll(a, b);
bedeutet:
  • übergebe den Wert von a, aber nicht die Adresse von a an die Funktion,
  • übergebe die Adresse von b und nicht (nur) den Wert von b an die Funktion


Zusatz:

Obwohl die formalen Parameter in Deiner Funktion i und j heißen und die aktuellen Parameter (die Variablen) in Deinem Code auch i und j heißen, sind dies völlig unterschiedliche Dinge. Das ist auch ein C/C++ Stolperstock.
 
Zuletzt bearbeitet: (zusatz)
Zurück
Oben