0 Daumen
311 Aufrufe

In einer Aufgabe sollen wir beantworten was dieser Code ausführt, die Funktionen sind absichtlich nicht kennbar bezeichnet.

1. Einlesen einer Zahl a und Ausgabe ihrer Quadratzahl a^(2)

2. Einlesen zweier Zahlen a,b und Ausgabe des Produkts a*b

3. Undefiniert.

4. Einlesen zweier Zahlen a,b und Ausgabe der Zahl b

Ich weiss dass die Lösung die 2. Antwort ist. 

Aber wie wird der Code gelesen ? 



Code:

#include <iostream> 

int i () {
int x;
std::cin >> x;
return x;
}

int f (int x) {
return i () * x;
}

int main () {
std::cout << f (i());
return 0;
}

Meine Idee

1. Main
Ich gehe in die main-Funktion und siehe dass die Funktion f aufgerufen wird.
Die Funktion wird aber mit einem Argument aufgerufen, das wiederum eine Funktion ist.  Also i()

2. In der Funktion i()
Wenn ich dann direkt oben im Code zur Funktion i() gehe, wird dort eine Variabel x definiert und anschliessend vom Nutzer eingelesen und so returnt.
Sagen wir allgemein: die Funktion i() returnt den Wert x. 

3. Zurück im Main
Jetzt wird der Aufrufer f( i() ) zu f ( x ).
Ich gehe also nach oben zur  Funktion f.

4. In der Funktion f 
Hier wird der Wert i() * x returnt, da wir x bereits evaluiert haben, wird x von Schritt 2 verwendet.
Aber vorher noch wird ein zweites mal die Funktion i() aufgerufen und eine zweite Zahl x eingelesen. 
Die Zahl muss nicht geleich sein wie das x von der ersten Eingabe des Nutzers. 

Frage
Hier, bei Schritt 4,  bin ich extrem unsicher.
Ich glaube ohne die Lösung zu wissen, hätte ich sie falsch beantwortet. 

Ich frage mich, wieso ändert sich nach der zweiten Eingabe von x nicht auch das x, was in der ersten Eingabe gemacht wurde. 




Avatar von

1 Antwort

0 Daumen

Hallo limonade,

Hier, bei Schritt 4,  bin ich extrem unsicher.
Ich glaube ohne die Lösung zu wissen, hätte ich sie falsch beantwortet. 

hast Du nicht. Deine Beschreibung ist völlig korrekt.


... wieso ändert sich nach der zweiten Eingabe von x nicht auch das x, was in der ersten Eingabe gemacht wurde. 

Weil es ein 'anderes' \(x\) ist. Dazu muss man verstehen, was ein Stack ist (weißt Du?) und was ein Aufruf wie

int f( int x ) {..
eigentlich tut. Hier wird ein Wert (genauer ein nach dem Typ int konvertierter Wert), der von außen kommt, auf den Stack kopiert. Wichtig ist das 'kopiert'!

D.h. in dem Moment, wo das Programm die Funktion \(f\) erreicht, ist das Ergebnis des ersten Aufrufs von \(i()\) bereits auf dem Stack kopiert worden. Jetzt kann ein zweites Mal die Funktion \(i()\) gerufen werden und das Resultat wird mit der Kopie des ersten Resultats multipliziert.

Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community