1 | x = (x == 16) ? 4 : x++; |
ich würde sagen ja, x wird 2 mal modifiziert. Einmal Zuweisung, einmal x++.
|
Forum: Compiler & IDEs ist das undefined behaviour?
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" 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. 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.
|
|