Inkrementoperator in C++ und Java



  • Hallo zusammen,

    bei einer formalen Verifikation über einem Java-Programm ist mir folgendes aufgefallen:

    #include <iostream>
    using namespace std;
    
    int main() {
    
            int x = 4;
            x = x++;
            cout << x << endl; // 5
    
            return 0;
    
    }
    
    public static void main(String[] args) {
    		int x = 4;
    		x = x++;
    		System.out.println(x); //4
    	}
    

    Ich finde die Java-Variante überhaupt nicht intuitiv und würde gerne wissen, ob es dazu Argumente gibt. Noch stehe ich auf der C++-Seite 😃

    Vielen Dank
    LG, freakC++



  • Das ist in C++ undefiniertes Verhalten (bzw. der Wert ist unspezifiziert), weil die Zuweisung und das Postinkrement nicht sequenziert sind; das bedeutet, dass vom Standard nicht festgelegt ist, was zuerst passiert. Dass dein Compiler das so macht, ist mehr oder weniger Zufall. Ob das in Java wohldefiniert ist, kann ich dir nicht sagen.


  • Mod

    Das ist, mindestens in C++, wahrscheinlich auch in Java, undefiniertes Verhalten. Daher gibt es da gar nichts über intuitiv zu diskutieren. Es ist einfach Unsinn. Diskutieren kann man darüber, wieso das undefiniert ist und wieso dir das nicht bekannt ist.

    edit: 30 Sekunden zu spät
    edit2: Ich habe mal nachgeschlagen: In Java ist das Verhalten definiert. Und zwar ganz intuitiv: Ausdrücke streng von links nach recht (hier nicht relevant, da nur ein Unterausdruck), Seiteneffekte sind sofort sichtbar (das heißt, das Postinkrement wirkt hier vor der Zuweisung und das Ergebnis ist daher am Ende 4).




Log in to reply