Von dem Ergebnis bin ich aber doch ziemlich entsetzt. Vor allen das Ausgabe 2 und 4 das selbe Ergebnis liefern verstehe ich nicht. Den Ergebnistyp einer Addition muss der Compiler doch aus den beteiligten Operanden ableiten und da hätte ich nicht vermutet das der Compiler da eine Art Prioritätsentscheidung über beide Operanden macht, ich hätte mit "der Typ des linken Operand wird für das Ergebnis genommen" gerechnet.
So können sich Erwartungen unterscheiden. Ich hätte immer erwartet, dass eine Addition kommutativ ist. Pointer plus Zahl oder Zahl plus Pointer gibt wieder einen Pointer - was sollte auch sonst sinnvolles rauskommen dabei?
Kommutativität ist etwas anderes: ∀ a,b ∊ X: a + b = b + a. Da passt der Fall nicht rein, weil a und b nicht aus der selben Menge sind. Es handelt sich praktisch um zwei verschiedene +. PTR + INT ist logisch und macht Sinn.
Aber die existens von "+: INT×PTR -> PTR" ist doch fragwürdig. Ich würde bei Addition erst einmal ein Neutrales Element und ein Inverses erwarten.
5 + (char*)0 = (char*)5 ≠ 5.
5 + (char*)1 - (char*)1 = (char*)6 - (char*)1 = ? 5 ¿
Deshalb würde ich da jetzt sowohl bei 5[ x], als auch bei 5 + x einen Compilere-ERROR für angebracht halten.