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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren