Ist das definiert? a = b[++i] + 2*b[++i];



  • ProgChild schrieb:

    Ist das nicht, wie beim || Operator?

    Nein. Bei || und && ist die Reihenfolge definiert und bei obengenanntem Konstrukt nicht.



  • simon.gysi schrieb:

    Nein. Bei || und && ist die Reihenfolge definiert

    Allerdings auch nur beim builtin bool vs. bool. Bei einem op&& (oder op||) Marke Eigenbau ist die Reihenfolge auch nicht definiert.



  • ja, richtig. ein guter grund um || oder && nicht zu überladen.



  • simon.gysi schrieb:

    ja, richtig. ein guter grund um || oder && nicht zu überladen.

    it depends.

    [in expression templates kann man dieses verhalten perfekt nachbilden, also ist es dort kein problem]



  • hmm ich dachte nach

    b[++i] ist das i erhöht

    2*b[++i] und wird dann hier nochmal erhöht

    aus beiden termen dann die summe



  • Es ist dem Compiler freigestellt, in welcher Reihenfolge er die Argumente des operator+ auswertet. Er macht intern also sowas:

    pseudocode

    //erste Möglichkeit, Auswertung links nach rechts
    inc i
    tmp1 = b[i]
    inc i
    tmp2 = 2*b[i]
    a = tmp1+tmp2
    
    //zweite Möglchkeit, Auswertung rechts nach links
    inc i
    tmp1 = 2*b[i]
    inc i 
    tmp2 = b[i]
    a = tmp1+tmp2
    

    Welche von beiden Möglichkeiten sich der Compiler aussucht ist nicht definiert



  • In diesem Fall gibt es nicht nur zwei Möglichkeiten, sondern beliebig viele, da das Verhalten nicht unspezifiziert, sondern wegen der mehrfachen Modifikation von i sogar undefiniert ist.



  • hmm ... ich ich dachte damals im studium gelernt zu haben, das die abarbeiten von operationen links nach rechts läuft, wo bei die prioritäten noch geregelt sind bspw. & und * sowieso an erster stelle.. punkt vor stricht etc.

    aber ist wohl compiler abhänging;)



  • BorisDieKlinge schrieb:

    hmm ... ich ich dachte damals im studium gelernt zu haben, das die abarbeiten von operationen links nach rechts läuft, wo bei die prioritäten noch geregelt sind bspw. & und * sowieso an erster stelle.. punkt vor stricht etc.

    Du verwechselst hier was: bei a() + b() * c() wird natürlich zuerst das Ergebnis von b() mit dem von c() multipliziert, bevor das von a() dazu addiert wird. Aber dennoch könnte es sein, dass die Funktion a() vor der Funktion c() vor der Funktion b() aufgerufen wird.



  • ***


Anmelden zum Antworten