Gast
#1270796
1 | |
ich würde sagen ja, x wird 2 mal modifiziert. Einmal Zuweisung, einmal x++.
|
Anzeige
|
ist das undefined behaviour?
Gast
#1270796
ich würde sagen ja, x wird 2 mal modifiziert. Einmal Zuweisung, einmal x++.
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? Aha: Wenn man es so schreibt wird es akzeptziert -
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. Mark Brandis schrieb:
>
> > Denk ich jetzt mal so. Anschaulichkeit und ternärer Operator geht nicht > immer zusammen ;) Genau. Denn da steht
Und das ist, wie der GCC korrekt erkennt "Undefined behavior"
Gast
#1270831
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:
wohldefiniert sein, oder?! 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. 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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|