2015-12-11 3 views
5

In With arrays, why is it the case that a[5] == 5[a]? wird erläutert, dass die [] Operator in a[5] als *(a + 5) definiert ist und weil + kommutativ ist, bedeutet 5[a]*(5 + a) und so die beiden Ausdrücke auf die gleiche Speicherstelle beziehen. Fein.Warum ist 5 [a] gültig und erzeugt keinen Fehler der ungültigen Kennung?

Allerdings definiert C in 6.4.2.1 auch, dass ein Bezeichner nicht mit einer Ziffer beginnen darf. In 5[a] ist die Array-ID 5, die keine gültige Kennung ist. Warum generiert 5[a] keinen Fehler über einen ungültigen Bezeichner?

Antwort

10

5 ist kein Bezeichner, es ist ein Integer-Literal.

Der C-Standard fest, dass buchstäblich 5[a] nur syntaktischer Zucker ist, die mit *(5 + a) gleichwertig sein müssen. Es gibt keine Anforderung in C, dass der erste Operand des Operators + ein Bezeichner ist, also funktioniert der Code gut.

6.5.6, emphasis Mine:

für Addition, entweder beiden Operanden werden arithmetischen Typen haben, oder ein Operand ein Zeiger auf ein vollständiges Objekttyp sein soll und die anderen werden Integer-Typen haben,.

+0

FYI: Der C-Standard verwendet den Begriff _integer constant_ (was klarstellt, gibt es keine (symbolischen) Konstanten wie in anderen Sprachen). – Olaf

Verwandte Themen