undefined behavior?

mogbo

Banned
Hallo,
frohes Neues :)

Die Frage ist eigentlich recht simpel:
Code:
int
main()
{
        int i = 1;
        printf("%i + 2 = %i\n", i, i += 2);
        printf("%i + 2 = %i\n", i, i += 2);

        return 0;
}

Ausgabe in OpenBSD (warning: unsequenced modification and access to 'i'):
Code:
1 + 2 = 3
3 + 2 = 5

Andere:
Code:
3 + 2 = 3
5 + 2 = 5

Mir ist der Hintergrund klar, aber ist das undefined behavior oder einfach nur einstellungsabhängig?
 
Unspecified behaviour, die Reihenfolge, in der die Funktionsparameter ausgewertet werden ist explizit nicht vom Standard festgelegt.
 
Es ist zwar unspecified behavior, in welcher Reihenfolge Funktionsargumente ausgewertet werden. (C11 §6.5.2.2)
Aber hier liegt auch undefined behavior vor:
Die beiden (Teil-)Ausdrücke "i" und "i += 2" sind unsequenced (C11 §5.1.2.3p3) zueinander, was aus obigem unspecified behavior folgt.
"i += 2" verändert das Objekt "i" und der Ausdruck "i" liest es.
Aber da die beiden Ausdrücke unsequenced sind, ist das Verhalten undefiniert. (C11 §6.5p2)
Da dies auf jeden Fall ausgeführt wird, hat das Programm gemäß der C-Norm keine Bedeutung.
 
Zurück
Oben