ist das undefined behaviour?

#1270808
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?
#1270826
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.
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:
1
x = ++x;
wohldefiniert sein, oder?!
#1270835
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.
#1270836
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 schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.