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


von Anfänger (Gast)


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!

von Markus (Gast)


Lesenswert?

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


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

von Fabian B. (fabs)


Lesenswert?

probier mal (*data)++

Gruß
Fabian

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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 = ?

von Rufus Τ. F. (rufus) Benutzerseite


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

von Anfänger (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Anfänger (Gast)


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.....

;)

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.