Funktion



  • Hallo wo ist der Untschied bei den 2 Programmen ?

    Also was habe ich davon wenn ich am ende der Funktion return erg; schreibe

    beide Varianten funktionieren.

    #include <iostream>
    using namespace std;
    
    int add ( int a , int b);
    
    int main()
    {
    int a,b;
    int erg;
    
            cin>>a;
            cin>>b;
    
            cout<< add(a,b);
    
    system("PAUSE");
    }
    
            int add ( int a , int b)
            {
            int erg;
            erg = a+b;
    
            }
    
    #include <iostream>
    using namespace std;
    
    int add ( int a , int b);
    
    int main()
    {
    int a,b;
    int erg;
    
            cin>>a;
            cin>>b;
    
            cout<< add(a,b);
    
    system("PAUSE");
    }
    
            int add ( int a , int b)
            {
            int erg;
            erg = a+b;
            return erg;
    
            }
    


  • Der Unterschied ist, dass nur die zweite Variante korrekt ist. Der Rest ist Zufall.



  • "return erg" liefert dir in deinem Fall das Ergebnis der Addition zurück.

    Variante 1 sollte demnach nicht funktionieren.

    Was in dem Fall zurückgeliefert wird weiß ich nicht (wahrscheinlich immer 0)
    Wieso ist das überhaupt kompilierbar? ^^

    Keros



  • Der Compiler sollte dich eigentlich darauf hinweisen dass du nichts zurückgibst. Du musst ihm schon irgendwie sagen was er zurückgeben soll.

    Davon abgesehen: Einrückungen sind was sehr schönes, allerdings nur wenn man sie so macht dass sie auch was bringen - was bei deinem geposteten Code leider nicht wirklich der Fall ist.



  • Keros schrieb:

    Wieso ist das überhaupt kompilierbar? ^^

    Ist es bestimmt nicht. Zumindest mein MS-Compiler würde sowas nicht zulassen. Und jeder andere vernünftige Compiler wohl auch nicht...



  • _matze schrieb:

    Ist es bestimmt nicht.

    Leider gibts Compiler die auf sowas bestenfalls mit einer Warnung reagieren und annehmen dass die Letzte Zuweisung das Ergebns beinhaltet. Die geben dann unaufgefordert den Wert zurück.



  • _matze schrieb:

    Keros schrieb:

    Wieso ist das überhaupt kompilierbar? ^^

    Ist es bestimmt nicht. Zumindest mein MS-Compiler würde sowas nicht zulassen. Und jeder andere vernünftige Compiler wohl auch nicht...

    Mit meinem g++ gehts (hab testweise aus einer Funktion alle returns entfernt)
    Ich bekomme nur ein Warning. (sinn dahinter versteh ich zwar nicht aber eventuell ist das ja irgendwo so spezifiziert)

    Keros



  • pumuckl schrieb:

    Leider gibts Compiler die auf sowas bestenfalls mit einer Warnung reagieren und annehmen dass die Letzte Zuweisung das Ergebns beinhaltet. Die geben dann unaufgefordert den Wert zurück.

    Die geben den Wert der letzten Zuweisung an irgendeine beliebige Variable zurück? In meinen Augen ziemlich sinnfrei, und es verleitet sicher zu Fehlern... hm...



  • Also Kompilieren lässt es sich aber man bekommt halt eine Warnung ausgeben.



  • _matze schrieb:

    Die geben den Wert der letzten Zuweisung an irgendeine beliebige Variable zurück? In meinen Augen ziemlich sinnfrei, und es verleitet sicher zu Fehlern... hm...

    Auch Zufall, nehme ich an. Ich denke eher, auf x86 Architekturen wird, sofern die Plattform ein Register für die Rückgabe nutzt, einfach der Wert genommen, der zufällig im Rückgaberegister steht. Oder allgemeiner ausgedrückt, das was am Speicherort des Rückgabewerts zuletzt stand. Ich glaube jedenfalls nicht, dass ein Compiler "absichtlich" einen ganz bestimmten Wert hernimmt.

    Zumindest erahnen kann man das hieran (Linux, x86, gcc 4.1.2)

    int correct()
    {
        return 20;
    }
    
    int testable()
    {
        correct(); // 1.
        /* alternativ: */
        20; // 2.
    }
    
    int main()
    {
        printf("%d\n", testable());
        // Ausgabe bei 1.: 20
        // Ausgabe bei 2.: -12620
    }
    

Log in to reply