Übungsaufgabe



  • Guten Tag,
    ich habe ein Verständnisproblem bei folgender Übungsaufgabe:

    #include <iostream>
    using namespace std;
    
    int y = 1;
    int f1(int x)
    {
      y = y * 2;
      return y*x;
    }
      int f2(int *x)
    {
      int y = (*x) * 2;
      return y*(*x);
    }
      int main()
    {
    /*(1)*/ int y = f1(1);
    /*(2)*/ cout << y << endl;
    /*(3)*/ cout << f2(&y) << endl;
    /*(4)*/ cout << f1(1) << endl;
    /*(5)*/ cout << y << endl;
    _getch();
    return 0;
    }
    

    Benötigt werden Erklärungen bzw. Ausgaben für die Punkte 1-5.
    Mein Verständnisproblem liegt nun im Punkt (5) welcher "2" ausgibt.
    Meine Lösung war 8, weil ich davon ausgegangen bin das bei y = y * 2 y (global) der Wert 4 zugewiesen wird, daher meine Frage:
    Warum wird y in der Funktion f1 kein neuer Wert zugewiesen, obwohl y doch global ist?
    In der Funktion f2 hatte ich mir das so erklärt das durch das int eine neue lokale y Varibale deklariert wurde, aber das ist in f1 ja nicht der Fall.

    Gruß Tim0



  • @tim0 sagte in Übungsaufgabe:

    y = y * 2 y

    Steht wo in dem von Dir geizeigem Code?



  • Hoppla, da sollte ein "für" zwischen, also:
    Meine Lösung war 8, weil ich davon ausgegangen bin das bei y = y * 2, für y (global), der Wert 4 zugewiesen wird, daher meine Frage:



  • @tim0 sagte in Übungsaufgabe:

    Meine Lösung war 8, weil ich davon ausgegangen bin das bei y = y * 2, für y (global), der Wert 4 zugewiesen wird, daher meine Frage:

    Daher deine Frage: [Doppelpunkt][Nichts]

    @tim0 sagte in Übungsaufgabe:

    daher meine Frage:
    Warum wird y in der Funktion f1 kein neuer Wert zugewiesen, obwohl y doch global ist?

    y wird in der Funktion f1() ein Wert zugewiesen.



  • Aber sollte das Ergebnis für Punkt (5) dann nicht "4" sein?

    y würde bei Punkt (1) zunächst durch "y = y * 2" der Wert 2 zugewiesen werden, da y mit 1 initialisiert wurde,
    also y = 1 * 2.
    Anschließen wird y in der main Funktion der return-Wert yx also 21 zugewiesen, also ebenfalls 2.
    Da y in der Funktion f2 lokal ist hat diese keinen Einfluss.
    ind Punkt (4) wird wieder f1(1) aufgerufen, diesmal wird der return-Wert aber nicht y zugewiesen.
    y = y * 2 wäre nun also y = 2 * 2, damit wäre y = 4. Ausgegeben wird in Punkt (4) der return-Wert mit xy also 14.
    In Punkt (5) wird y aber mit 2 ausgegeben.

    Gruß Tim0



  • @tim0 sagte in Übungsaufgabe:

    also 21 zugewiesen

    die 21 scheidet völlig aus!

    int main()
    {
    	/*(1)*/ int y = f1(1);
    	// global y = global y * 2 = 1 * 2 = 2 --> global y = 2
    	// local y = global y * x = 2 * 1 = 2
    
    	/*(2)*/ cout << y << endl;
    	// local y = 2
    
    	/*(3)*/ cout << f2(&y) << endl;
    	// function local y = 2 * 2 = 4
    	// returns 4 * 2 = 8
    
    	/*(4)*/ cout << f1(1) << endl;
    	// global y = y * 2 = 2 * 2 = 4
    	// returns 1 * 4 = 4
    
    	/*(5)*/ cout << y << endl;
    	// local y is still 2
    }
    


  • ich hab da auch Verständnisprobleme. Ich würde erstmal alles mit sinnvollen Bezeichnern ausstatten. Keiner nennt ungestraft alles nur x, y und fn und blickt eine Woche später noch durch.



  • Hallo Tim0,

    es wird 2 ausgegeben, weil dieses y die lokale Variable von Zeile

    /*(1)*/ int y = f1(1)
    

    benutzt.
    Wenn du

    cout << ::y << endl; // beachte den Doppelpunkt, d.h. globaler Scope
    

    ausgibst, dann wird auch 4 ausgegeben, s.a. Ideone-Code ! 😉



  • Danke schön, ich habe es nun verstanden. 😀
    Gruß Tim0


Log in to reply