Paul Roßmann schrieb:
> Das verstehe ich nicht.
> Ich hätte erwartet das ((const long*)mem) vom Typ const long* ist,
Ist es auch.
Aber:
Das ist ein Ausdruck. Da entsteht also ein temporäres Zwischenergebnis.
Nämlich ein Pointer der vom Typ const long* ist.
Dein Code versucht jetzt genau dieses temporäre Zwischenergebnis zu
inkrementieren.
Das geht zwar im Prinzip, ist aber sicher nicht das was du willst. Denn
ein temporäres Zwischenergebnis zu inkrementieren, welches nach
Beendigung der kompletten Anweisung (beim nächsten Sequence Point)
wieder ins Nirvana verschwindet, macht in den meisten Fällen keinen
Sinn.
> Wenn ich die eine Zeile durch folgenden Codeausschnitt ersetze, gibt es
> keine Compilerfehler mehr:
>
1 | > const long *a;
|
2 | > a = ((const long*)mem);
|
3 | > a++;
|
4 | > mem = (void*)a;
|
5 | >
|
logisch.
Jetzt wird ja auch kein Zwischenergebnis mehr inkrementiert, sondern
eine tatsächlich real existierende Variable.
Dein ursprünglicher Code ist eine Variante von
1 | int i = 5, j = 8;
|
2 |
|
3 | ( i - j ) ++;
|
i - j ist ein arithmetischer Ausdruck, der ein Ergebnis hat. Dieses
Ergebnis kann man nicht inkrementieren. Es existiert ja nicht real im
Speicher.
In diesem Sinne ist auch der Cast nichts anderes als diese Subtraktion
hier: Ein Operator, der ein Argument nimmt und daraus ein Ergebnis
erzeugt. Bei einem Cast bleibt (in diesem Fall) dann zwar der Zahlenwert
konstant, aber der Datentyp ändert sich. Aber es ist trotzdem ein
Operator, der aus einem Argument ein Ergebnis macht. Und dieses Ergebnis
ist temporär.