mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unterschied *data +=1 und +data++


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Die Grundlagen von C sitzen. So dachte ich zumindest....

Ich versuche gerade, eine Funktion aufzustellen, der ich pointer 
übergebe. Die Funktion soll nur die Daten, die sie erhält 
inkrementieren.
void foo(char*data)
{
     *data +=1; // geht
     *data ++;  // geht nicht.
}

im main:
char value = 0;
printf("vorher: %d\r\n",value);
foo(&value);
printf("nachher: %d\r\n",value);

Warum gibt es einen Unterschied zwischen ++ und +=1 ?

1) Besteht dieser Unterschied nur in Bezug auf Pointer?
2) Wenn ja, wird diesser bei ++ dann um seine Bitbreite(hier char) 
geshiftet?
3) Gilt +=1 dann im Gegensatz zu ++ als Zuweisung bezugnehmend auf d. 
Inhalt?
4) ++*data habe ich nicht versucht, evtl. lohnenswert?

Danke für Hilfe!

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> *data +=1; // geht
>      *data ++;  // geht nicht.


bei *data++ wird der Zeiger erhöht, nicht der Inhalt

Autor: Fabian B. (fabs)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier mal (*data)++

Gruß
Fabian

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> 1) Besteht dieser Unterschied nur in Bezug auf Pointer?
Er besteht aufgrund der Priorität der Operatoren * und ++

Das ist wie wenn du schreibst:   1 + 2 * 3 - 4 / 5 = ?
Aber meinst:                   ((1 + 2)* 3 - 4)/ 5 = ?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> Warum gibt es einen Unterschied zwischen ++ und +=1 ?

Den gibt es nicht, Du solltest Dir mal die Regeln des Operatorvorranges 
("operator precedence rules") näher ansehen.

http://www.difranco.net/cop2220/op-prec.htm

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil der compiler hier nicht zwischen arithmetischen operatoren und dem 
"poiinter-sternchen" unterscheiden kann?

Dann sollte (*data) sich ja von der dahinter liegenden arithmetik 
abkapseln richtig?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> weil der compiler hier nicht zwischen arithmetischen operatoren und dem
> "poiinter-sternchen" unterscheiden kann?
Er könnte es schon. Er ist aber nicht so programmiert, dass er diese 
für dich "fehlerhafte" Beschreibung automatisch korrigiert. Wie auch? 
Es ist ja eine gültige Operation mit klar definierten Regeln. Je nach 
Compiler könnte er dich aber evtl. warnen, dass da was faul sein 
könnte...

Es ist ja nicht so, dass  *a++  nichts sinnvolles macht.
Da wird eben *(a++) gemacht, weil ++ stärker bindet.
Wenn du (*a)++ willst, dann mußt du das genau so hinschreiben.

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antworten, jetzt ist mein Problem transparent.

Wie immer, ist der Programmierer Schuld.... Ist ja alles gültig, was ich 
dem Compiler mitgeteilt habe.....

;)

Autor: Andreas Schweigstill (Firma: Schweigstill IT) (schweigstill) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anfänger schrieb:
> weil der compiler hier nicht zwischen arithmetischen operatoren und dem
> "poiinter-sternchen" unterscheiden kann?

Er könnte es schon, wenn es in der Auswertungsreihenfolge der Operatoren 
so definiert wäre. Es wäre jedoch eine Katastrophe, wenn sich 
diesbezüglich jeder Compiler anders verhalten würde.

Dass *data++ den Zeiger inkrementiert und nicht die Variable, ist sogar 
der weitaus häufigere Anwendungsfall, da es sehr oft vorkommt, dass man 
durch eine Liste bzw. einen String hindurchläuft und eine zeichenweise 
Verarbeitung vornimmt.

> Dann sollte (*data) sich ja von der dahinter liegenden arithmetik
> abkapseln richtig?

Ja.

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.