Forum: Compiler & IDEs ist das undefined behaviour?


von Martin (Gast)


Lesenswert?

1
x = (x == 16) ? 4 : x++;
ich würde sagen ja, x wird 2 mal modifiziert.
Einmal Zuweisung, einmal x++.

von Mark B. (markbrandis)


Lesenswert?

1
if (x == 16)
2
{
3
    x = 4;
4
}
5
else
6
{
7
    x++;
8
}

Denk ich jetzt mal so. Anschaulichkeit und ternärer Operator geht nicht 
immer zusammen ;)
Edit: Der gcc sagt "warning: operation on `x' may be undefined". Er mag 
das x++ tatsächlich nicht, da sollte wohl laut Standard keine Anweisung 
stehen?

von Mark B. (markbrandis)


Lesenswert?

Aha: Wenn man es so schreibt wird es akzeptziert -
1
x = (x == 16) ? 4 : x+1;

von (prx) A. K. (prx)


Lesenswert?

Mark Brandis schrieb:

> Edit: Der gcc sagt "warning: operation on `x' may be undefined". Er mag
> das x++ tatsächlich nicht, da sollte wohl laut Standard keine Anweisung
> stehen?

Es ist im Standard ausdrücklich nicht definiert, ob die Inkrement 
Operation auf "x" vor oder nach der Zuweisung erfolgt.

Deshalb könnte
   x = (x == 16) ? 4 : x++;
sowohl als
   temp = (x == 16) ? 4 : x;
   if (x == 16) x += 1;
   x = temp;
also
   x = (x == 16) ? 4 : x;
wie auch als
   x = (x == 16) ? 4 : x;
   if (x == 16) x += 1;
ausgeführt werden.

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Mark Brandis schrieb:
>
1
> if (x == 16)
2
> {
3
>     x = 4;
4
> }
5
> else
6
> {
7
>     x++;
8
> }
9
>
>
> Denk ich jetzt mal so. Anschaulichkeit und ternärer Operator geht nicht
> immer zusammen ;)

Genau. Denn da steht
1
if (x == 16)
2
{
3
    x = 4;
4
}
5
else
6
{
7
   x = x++;
8
}

Und das ist, wie der GCC korrekt erkennt "Undefined behavior"

von Sven P. (Gast)


Lesenswert?

A. K. schrieb:
> Es ist im Standard ausdrücklich nicht definiert, ob die Inkrement
> Operation auf "x" vor oder nach der Zuweisung erfolgt.

Ich dachte, es wird immer zuerst die RECHTE Seite bewertet? Also erst 
den ternären Ausdruck einschließlich x++ und DANN die Zuweisung?

Edit sagt:
Achso, ich seh das Problem. Aber dann müsste doch sowas:
1
x = ++x;
wohldefiniert sein, oder?!

von (prx) A. K. (prx)


Lesenswert?

Sven P. schrieb:

> Ich dachte, es wird immer zuerst die RECHTE Seite bewertet? Also erst
> den ternären Ausdruck einschließlich x++ und DANN die Zuweisung?

Nein. Eine Zuweisung ist kein Sequence Point, der liegt erst am Ende 
dieses Statements.

von (prx) A. K. (prx)


Lesenswert?

Sven P. schrieb:

> x = ++x;
> wohldefiniert sein, oder?!

Nein. Er darf das nämlich als
   x += 1;
   x = x;
und als
   temp = x + 1;
   x += 1;
   x = temp;
wie auch als
   temp = x + 1;
   x = temp;
   x += 1;
implementieren. Letzteres überrascht dann vielleicht etwas.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.