Unterschied *data +=1 und +data++

Gast #2086980
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.
1
void foo(char*data)
2
{
3
     *data +=1; // geht
4
     *data ++;  // geht nicht.
5
}
6

7
im main:
8
char value = 0;
9
printf("vorher: %d\r\n",value);
10
foo(&value);
11
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!
Gast #2087019
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?
Moderator (Firma: Titel) Persönliche Seite #2087035
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.
(Firma: Schweigstill IT) Persönliche Seite #2087072
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

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.

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.