Programm gibt andere Ergebnisse aus, als erwartet



  • Hallo c-plusplus Community,
    ich bin neu hier und werde euch in nächster Zeit mit meinen Fragen nerven. 😃
    Ich bin gerade beim C++ lernen und steck jetzt hier fest:

    int doIt(int a, int& b, int *c) {
    
    	a *= 3;
    	b += 4;
    	*c += a + b;
    	return a + b + *c;
    }
    
    int main() {
    
    	int a, b, c;
    	a = b = c = 2;
    	c = doIt(a, b, &a);
    
    	cout << "a: " << a << " b: " << b << " c: " << c << endl;
    }
    

    Das Programm liefert die Ergebnisse: a: 14 b: 6 c: 26
    Meine Frage ist jetzt, wie man auf die Ergebnisse kommt, da ich eigentlich andere Ergebnisse erwartet habe, und zwar a: 2 b: 2 c: 24.
    Kann mir das jemand Schritt für Schritt erklären?

    Danke schon mal im voraus,

    Error319



  • Hier ist, was die Funktion genau macht:

    int doIt(int a, int& b, int *c) {
    
        a *= 3; // doIt::a = 6 (2*3)
        b += 4; // main::b = 6 (2+4)
        *c += a + b; // main::a = 2 + 6 + 6 (2 ist der alte Wert, a und b wurden draufaddiert)
        return a + b + *c; // Rückgabe = 12 + 6 + 6 = 24. Das ist auch der neue Wert von c.
    }
    


  • So, mir ist jetzt klar wie man auf c = 26 kommt.
    Aber ich versteh nicht wieso sich auch a und b ändern 😕

    int doIt(int a, int& b, int *c) {
    
        a *= 3; // = 6
        b += 4; // = 6
        *c += a + b; // = 14
        return a + b + *c; // = 6 + 6 + 14 = 26 -> c
    }
    


  • b wird als Refernez übergeben. (beachte das & bei b in der Paramterliste von doIt)

    Damit hat die Funktion Zugriff auf die entsprechende Variable der aufrufenden Funktion.



  • Aber ich versteh nicht wieso sich auch a und b ändern

    Weil die Funktion eine Referenz bzw. einen Zeiger auf a und b haben. Über diese können sie die Variablen ändern.

    Kennst du diese Sprachmittel eigentlich?



  • Und schau mal genau hin. Beim Aufruf von doIt ist c nicht dabei.



  • Ja aber die Funktion wird doch nur bei c angewendet, d.h. doch, dass a und b sich nicht verändern, also a = 2 und b = 2, oder nicht?

    Anders kann ich es mir nur so erklären, dass die Werte von a und b in der Funktion verändert werden, aber dann müsste a = 6 und b = 6 rauskommen.
    b würde dann stimmen, aber bei a kommt ja 14 raus, woher kommt die 14? Die 14 kommt nur bei

    *c += a + b
    

    vor, aber das hat ja nichts mit a zu tun.

    Oder ist mein Gedankengang einfach nur Käse? 😕



  • DirkB schrieb:

    Und schau mal genau hin. Beim Aufruf von doIt ist c nicht dabei.

    Ahhhh, jetzt hab ichs verstanden 😃
    Danke 🙂


  • Mod

    Error319 schrieb:

    Oder ist mein Gedankengang einfach nur Käse? 😕

    ja, verwirrt durch die doppelte Verwendung von Bezeichnern.

    int doIt(int x, int& y, int *z) {
    
        x *= 3;
        y += 4;
        *z += x + y;
        return x + y + *z;
    }
    
    int main() {
    
        int a, b, c;
        a = b = c = 2;
        c = doIt(a, b, &a);
    
        cout << "a: " << a << " b: " << b << " c: " << c << endl;
    }
    

    und nochmal darüber nachdenken.



  • Oder gleich explizit:

    int doIt(int a_copied, int& b_ref, int *a_ptr) { 
    
        a_copied *= 3; 
        b_ref += 4; 
        *a_ptr += a_copied + b_ref; 
        return a_copied + b_ref + *a_ptr; 
    } 
    
    int main() { 
    
        int a, b, c; 
        a = b = c = 2; 
        c = doIt(a, b, &a); 
    
        cout << "a: " << a << " b: " << b << " c: " << c << endl; 
    }
    


  • Ist echt einfacher, dankeschön 🙂


Anmelden zum Antworten