"&" vor Variablen



  • Hallo allerseits,

    ich hoffe Ihr könnt mir bei diesem Problem einen kleinen Denkanstoss geben.
    Es handelt sich um eine Klausuraufgabe, gefragt ist, welche Ausgabe durch folgendes Programm auf dem Bildschirm erscheint.

    #include <iostream>
    using namespace std;
    int test(int x,int &y,int &z)
    {
    int h = 3;
    x=x + 1; 
    y=y + 2; 
    h=x + h; 
    z=h;
    return y;
    }
    int main()
    {
    int a,b,c;
    cout<<"Aufgabe 5:"<<endl<<endl;
    b=1;
    c=test(b,b,a);
    cout<<"a = "<<a<<" b = "<<b<<
    " c = "<<c<< endl;
    return 0;
    }
    

    Die Lösung ist mir natürlich mithilfe eines Computers klar, Quelltext fix durchgejagt und schon strahlt mich die Lösung an:

    "Aufgabe 5:

    a = 5 b = 3 c = 3"

    Aber ich verstehe ehrlich gesagt überhaupt nicht, wieso das jetzt diese Werte ausgibt. Durch Variation der Zahlen, die addiert werden, konnte ich schon ein wenig mehr identifizieren, jedoch ist mein größtes Problem, dass ich nicht genau weiß, was denn nun das "&" vor den Variablen für einen Einfluss auf selbige hat.

    Ich bitte um einen kleinen Denkanstoß.

    Viele Grüße,
    Varrader



  • varrader2 schrieb:

    jedoch ist mein größtes Problem, dass ich nicht genau weiß, was denn nun das "&" vor den Variablen für einen Einfluss auf selbige hat.

    Schau im Buch deiner Wahl mal nach "Referenzen".



  • Google mal nach "C++ Referenz". Achtung: Referenz gibt's auch als Verzeichnis von C++-Librarys, das ist natürlich nicht gemeint.



  • Okay, vielen Dank, dass geht ja offenbar schonmal in die richtige Richtung.
    Am sinnvollsten erscheint mir dir Erklärung von http://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Weitere_Grundelemente/_Referenzen, allerdings kann ich nicht wirklich das dort beschriebene auf meine Aufgabe anwenden.

    Also, es werden die Variablen int a,b und c deklariert, dann wird im Main b=1 gesetzt.
    Dann c=test(b,b,a).

    Was genau passiert dann an dieser Stelle?



  • Stell dir vor, y und z entsprächen den Variablen b und a. D.h. wenn du etwas in y setzt, wird auch der Wert von b verändert. x wird mit b initalisiert, wenn x geändert wird, ändert sich b aber nicht.



  • Und womit wird dann z initialisiert? a wird ja nicht gesetzt. Einfach mit 0?



  • Ist egal, ein beliebiger Wert.
    Der wird ja sowieso nie benutzt, sondern nur überschrieben.



  • Undefiniert. Aber z wird ja gesetzt, bevor sein Wert verwendet wird.

    EDIT: 13 Sekunden zu spät. 😡



  • Ich gebs auf, ich kapier es schlichtweg nicht, auch wenn mich das gerade ziemlich wurmt. Die einzige Aufgabe dieser Art in knapp 20 Klausuren, ganz gute Pokerquote also 🤡

    Aber falls jemand sich erbarmt, und mir den genauen Ablauf aufschlüsselt, wäre ich natürlich dennoch dankbar, habe natürlich aber auch Verständnis, wenn da niemand Lust zu hat.



  • #include <iostream>
    
    using namespace std;
    
    int test(int x, int& y, int& z)
    {
    	// x=1, y=1, a=undef
    	int h = 3;
    
    	x = x + 1;
    	// x=2, y=1, a=undef, h=3
    
    	y = y + 2;
    	// x=2, y=3, a=undef, h=3
    
    	h = x + h;
    	// x=2, y=3, a=undef, h=5
    
    	z = h;
    	// z=5
    
    	return y; // y = 3
    }
    
    int main()
    {
    	int a, b, c; // a=undef, b=undef, c=undef
    
    	cout <<"Aufgabe 5:" << endl << endl;
    
    	b = 1;
    
    	// a=undef, b=1, c=undef
    
    	c = test(b, b, a);
    
    	// a=z	=>	a = 5 (Referenz)
    	// b=y => b = 3 (Referenz)
    	// c = y => c = 3
    
    	// a = 5	b = 3	c = 3
    	cout << "a = " << a << " b = " << b
    		 << " c = " << c << endl;
    
    	return 0;
    }
    


  • Grundgütiger, ich habs verstanden!

    Vielen Dank!



  • Mach dir einfach den Unterschied klar:

    #include <iostream>
    
    void Ref(int& ref) // Referenz mit &-Operator
    {
    	ref = 5;
    }
    
    void Value(int value)
    {
    	value = 10;
    }
    
    int main()
    {
    	int x = 4;
    
    	std::cout << "x = " << x << std::endl;
    
    	Ref(x); // Übergabe als Referenz, die Funktion kann den Wert also ändern und tut das auch: ref = 5
    
    	std::cout << "x = " << x << std::endl;
    
    	Value(x); // Übergabe als Value, die Funktion kann den Wert nicht ändern. Der Wert von 10 ist nur in der Funktion, also lokal gültig.
    
    	std::cout << "x = " << x << std::endl;
    
    	return 0;
    }
    


  • varrader2 schrieb:

    ...

    Da gab's gestern erst ein ähnliches Thema, wo ich dies zu schrieb.


Anmelden zum Antworten