www.mikrocontroller.net

Forum: Compiler & IDEs ist das undefined behaviour?


Autor: Martin (Gast)
Datum:

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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if (x == 16)
{
    x = 4;
}
else
{
    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?

Autor: Mark Brandis (markbrandis)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:
>
> if (x == 16)
> {
>     x = 4;
> }
> else
> {
>     x++;
> }
> 
>
> Denk ich jetzt mal so. Anschaulichkeit und ternärer Operator geht nicht
> immer zusammen ;)

Genau. Denn da steht
if (x == 16)
{
    x = 4;
}
else
{
   x = x++;
}

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
x = ++x;
wohldefiniert sein, oder?!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.