Zugriff auf Arrays über Index [Array] in C und C: Eine kommutative Kuriosität
Die rätselhafte Frage, die Interviewer verwirrt, lautet:
int arr[] = {1, 2, 3}; 2[arr] = 5; // Compiles? assert(arr[2] == 5); // Fails?
Die Intuition legt nahe, dass a[b] in *(a b) und seit der Addition übersetzt wird kommutativ ist, sollte 2[arr] *(2 arr) entsprechen.
Bestätigt der Standard dies?
Tatsächlich befürworten die C- und C-Standards dies Verhalten.
C-Standard (C99):
Abschnitt 6.5.2.1, Absatz 1:
Einer der Ausdrücke muss den Typ „Zeiger auf Objekttyp“ haben, der andere Ausdruck muss den Typ „Integer“ haben und das Ergebnis muss den Typ „Typ“ haben.
Absatz 2 (Hervorhebung hinzugefügt):
Ein Postfix-Ausdruck, gefolgt von einem Ausdruck in eckigen Klammern [], ist eine tiefgestellte Bezeichnung eines Elements eines Array-Objekts. Die Definition des Indexoperators [] ist, dass E1[E2] identisch ist mit (*((E1) (E2))). Aufgrund der Konvertierungsregeln, die für den Binäroperator gelten, bezeichnet E1[E2] das E2-te Element von E1, wenn E1 ein Array-Objekt ist (entspricht einem Zeiger auf das Anfangselement eines Array-Objekts) und E2 eine ganze Zahl ist (von Null an gezählt).
Schlussfolgerung
Der Standard besagt eindeutig, dass E1[E2] ist entspricht *(E1 E2), unabhängig von der Reihenfolge der Argumente. Daher liefert 2[arr] das gleiche Ergebnis wie arr[2], sodass sowohl die Zuweisung als auch die Behauptung erfolgreich sind, ohne die Augenbrauen hochzuziehen.
Das obige ist der detaillierte Inhalt vonIst „2[arr]' gleich „arr[2]' in C und C: Ein kommutativer Array-Zugriff?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!