Auswertungsreihenfolge UB?



  • Hallo,

    soweit ich weiß ist die Auswertungsreihenfolge von Funktionsaufrufen, deren Rückgabewerte als Parameter verwendet werden, nicht definiert bzw. kann der Compiler diese verteilen wie er will.

    Wenn ich jetzt so einen Code habe:

    #include <iostream>
    
    void f(int i, int j) { std::cout << i + j << "\n"; }
    
    int g() { return 1; }
    int h() { return 2; }
    
    int main()
    {
        f(g(), h());
    }
    

    Ist das dann auch UB? Weil die Reihenfolge ist ja eigentlich egal (also ob zuerst g oder h ausgewertet wird macht hier ja keinen Unterschied)?

    Oder ist das grundsätzlich immer UB?


  • Mod

    Das Verhalten hier ist glasklar definiert. Sonst könnte man die Sprache offensichtlich wegwerfen, weil man niemals Funktionen mit mehr als einem Parameter haben könnte.

    Probleme bekommst du, wenn deine Funktionen Nebeneffekte haben. Das berühmte Beispiel, angewendet auf dein f():

    int i = 1;
    f(i++, i++);
    

    11?
    12?
    21?
    22?
    Ganz was anderes?
    Undefiniert!



  • SeppJ schrieb:

    Das Verhalten hier ist glasklar definiert. Sonst könnte man die Sprache offensichtlich wegwerfen, weil man niemals Funktionen mit mehr als einem Parameter haben könnte.

    Probleme bekommst du, wenn deine Funktionen Nebeneffekte haben.

    Ok, das ist gut... dachte mir irgendwie schon dass das andernfalls Probleme geben würde, aber wollte dann doch mal auf Nummer Sicher gehen und hier nachfragen.

    Danke 👍


Log in to reply