Weil der Compiler den Nutzer vor sich selber schützt.Klar. Aber warum ist da offensichtlich ein Unterschied zwischen "((int) *p)" und "(int) *p"? Zwischen "(3 * 2)" und "3 * 2" ist doch auch keiner
Es ist nämlich nicht (int) *p, sondern
Code: Alles auswählen
sizeof(int) * p
Code: Alles auswählen
sizeof((int)*p))
Hinzu kommt Operatorpriorität http://www.proggen.org/doku.php?id=c:expr:opprio
Der Compiler wertet von links nach rechts aus, er findet sizeof, führt das aus und das Ergebnis ist ein int.
Wenn int links von etwas steht, dürfen nur noch bestimmte Operatoren folgen, die Dereferenzierung gehört nicht dazu. Also muss das * eine Multiplikation sein, aber Pointer als rvalue ist nicht zulässig.
Mit den Klammern drum herum, ist das was anderes. Die Klammern haben eine höhere Priorität, der Ausdruck wird also im Gesamten ausgewertet.