mikrocontroller.net

Forum: Compiler & IDEs Char-Wert incrementieren


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
ich nutze den Codevisioncompiler und bin auf folgendes Problem gestoßen:

char Anzahl = 0x06;

Anzahl = Anzahl++;  // Anzahl ist nun 0x07
...
Anzahl = 0x06;
Anzahl = Anzahl++;  // Anzahl BLEIBT NUN 0x06!!

Anzahl = Anzahl + 1;  // Anzahl wird um 1 erhöht

wo bleibt hier die Logik?! Kann  mir dass irgendwer erklären?!
Bin an diesem Fehler nun fast verzweifelt?! :-(

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:
> Anzahl = Anzahl++;  // Anzahl BLEIBT NUN 0x06!!

weil Anzahl++ als return den wert vor dem ++ liefert.

so sollte es gehen

Anzahl = ++Anzahl;

macht aber wenig, bis gar kein sinn.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Anzahl = Anzahl++;  // Anzahl BLEIBT NUN 0x06!!

Das ist mehr oder weniger undefiniert. Letztenendes ist nur das 
interessant, was der Compiler sagt, und der sagt mal wieder alles:
$ cat main.c
#include <stdio.h>

int main()
{
        char Anzahl = 0x06;

        printf("1: %d\n", Anzahl);

        Anzahl = Anzahl++;  // Anzahl ist nun 0x07
        printf("2: %d\n", Anzahl);

        Anzahl = 0x06;
        Anzahl = Anzahl++;  // Anzahl BLEIBT NUN 0x06!!
        printf("1: %d\n", Anzahl);

        Anzahl = Anzahl + 1;  // Anzahl wird um 1 erhöht
        printf("1: %d\n", Anzahl);

        return 0;
}
$ gcc -Wall -o main main.c 
main.c: In function ‘main’:
main.c:9: warning: operation on ‘Anzahl’ may be undefined
main.c:13: warning: operation on ‘Anzahl’ may be undefined
$ ./main 
1: 6
2: 7
1: 7
1: 8

Entgegen landläufiger Meinung sind Warnings nicht dazu da um ignoriert 
zu werden.

HTH

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Google mal nach „sequence points“.  Von mir aus auch im Zusammenhang mit 
„i = i++“.  Da werden Sie geholfen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g457 schrieb:
>> Anzahl = Anzahl++;  // Anzahl BLEIBT NUN 0x06!!
>
> Das ist mehr oder weniger undefiniert.

Nicht nur "mehr oder weniger". Das Verhalten dieser Zeile ist nach ISO-C 
undefiniert, was bedeutet, daß beliebige Dinge passieren können.

> Letztenendes ist nur das interessant, was der Compiler sagt, und der sagt
> mal wieder alles:

Was die Norm sagt, ist auch interessant.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Letztenendes ist nur das interessant, was der Compiler sagt, und der sagt
>> mal wieder alles:
>
> Was die Norm sagt, ist auch interessant.

Nur dann wenn der Compiler sich daran hält ;-) Aber Du hast schon recht, 
nur sind wir beide zu faul den entsprechenden Teil rauszuzitieren. 
Ausserdem liest kaum jemand zuerst die Norm wenns Probleme gibt. Da sind 
ein paar aussagekräftige Warnings dann schon sehr praktisch :-)

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.