Warum funktioniert diese Funktion?



  • Hallöle,
    habe hier eine C/C++ Funktion geschrieben, die super funktioniert und die
    ich auch verstehe:

    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    
    int addition(int,int);
    
    main()
    {
        int z1,z2,summe;
        cout<<"Zahl 1 eingeben: ";
        cin>>z1;
        cout<<"Zahl 2 eingeben: ";
        cin>>z2;
    
        summe = addition(z1,z2);
        getch();
    }
    
    int addition(int zahl1, int zahl2)
    {
    	int summe;
        cout<<"\nSumme =          ";
        summe=zahl1+zahl2;
        return(summe);
    }
    

    Wenn ich das aber nun wie folgt ändere, dann gehts auch...aber wieso???

    #include <iostream.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <conio.h>
    
    int addition(int&, int&, int&);
    
    main()
    {
        int z1,z2,summe;
        cout << "Zahl 1 eingeben: ";
        cin >> z1;
        cout << "Zahl 2 eingeben: ";
        cin >> z2;
        addition(z1,z2,summe);
        cout << "\nSumme =        : ";
        cout << summe;
        getch();
    }
    
    int addition(int &wert1, int &wert2, int &ergebnis)
    {
        ergebnis = wert1+wert2;
    }
    

    Ich verstehe nicht, was es mit dem 'kaufmännischen und' auf sich hat.
    Wieso benötige ich in der Funktion addition kein return?
    Woher weiss die Funktion main, dass bei cout << summe;
    der Wert 'ergebnis' aus der Funktion addition angezeigt werden soll?

    Danke
    Dickus



  • int addition(int&, int&, int&);

    Das bedeutet, daß Du drei Referenzen auf Integerwerte übergibst. Referenzen sind stellvertretend für eine Variable/Konstante.
    Wenn Du also einer Referenz etwas zuweist, dann weist Du in Wirklichkeit der Variablen etwas zu, für den die Referenz steht.
    Stell Dir das so ähnlich vor, als wenn Du Deiner Funktion einen Zeiger übergibst. Die Wirkung ist die gleiche, allerdings sind Referenzen etwas einfacher zu handhaben (keine Dereferenzierung erforderlich).
    Die Zuweisung in Deiner Funktion ändert also direkt den Wert von summe in der aufrufenden Funktion.

    Allerdings sollte wirklich Dein Compiler meckern, wenn Du Deine Funktion nicht mit return beendest ...



  • Danke für die schnelle Antwort.
    Das habe ich nun verstanden. Dazu war ich eben noch auf der Suche und
    habe etwas zu 'call by reference' und 'call by value' gefunden.

    Warum das aber ohne return funktioniert,
    ohne dass der Compiler meckert...keine Ahnung.

    Mit return geht's natürlich auch. 🙂

    Dickus



  • Dickus schrieb:

    Warum das aber ohne return funktioniert,
    ohne dass der Compiler meckert...keine Ahnung.

    Ich denke mal, dass das daran liegt, dass du deinen zu alten Compiler benutzt.. Meine Glaskugel sagt mir DevC++, richtig? - Der ist veraltet. Hol dir VC++ oder Code::Blocks.. (oder zumindes was gleichwertig aktuelles)



  • drakon schrieb:

    Ich denke mal, dass das daran liegt, dass du deinen zu alten Compiler benutzt..

    Das ist sehr naheliegend, da ja auch main() ohne Rückgabetyp verwendet wird. In C++ muss man auch int explizit angeben.

    Ausserdem sind alle eingebundenen Header nicht Standard-C++:

    #include <iostream.h>  // War nie wirklich C oder C++; schreib <iostream>
    #include <stdlib.h>    // C-Bibliothek; richtig wäre <cstdlib>
    #include <stdio.h>     // ebenfalls; besser <cstdio>
    #include <conio.h>     // Compilerspezifische Erweiterung; nicht Standard-C++
    


  • Das gibs sogar ein Videotutorial dazu! :xmas1:



  • das is cool 😃


Anmelden zum Antworten