Heim > Backend-Entwicklung > C++ > Kompiliert und übergibt 2[arr] = 5 die Behauptung in C und C?

Kompiliert und übergibt 2[arr] = 5 die Behauptung in C und C?

Mary-Kate Olsen
Freigeben: 2024-12-03 07:17:10
Original
261 Leute haben es durchsucht

Does 2[arr] = 5 Compile and Pass Assertion in C and C  ?

Zugriff auf Arrays über Index[array] in C und C

In einem Wissenstest, der manchmal von Interviewern gestellt wird, wird der folgende Code präsentiert:

int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
Nach dem Login kopieren

Es könnte zunächst so aussehen, als ob die Kompilierung des Ausdrucks 2[arr] fehlschlagen sollte, da er scheinbar versucht, ein Array zu indizieren Verwenden einer Ganzzahl als Array-Namen. Diese unerwartete Syntax ist jedoch tatsächlich sowohl in C als auch in C gültig.

Um zu verstehen, warum, schauen wir uns die technischen Details des []-Operators in diesen Sprachen an.

C und C Array-Zugriffssemantik

Gemäß dem C99-Standard (6.5.2.1 Absatz 1) erwartet der []-Operator Argumente in der Form:

  • Ein Ausdruck vom Typ „Zeiger auf Objekt“
  • Ein Ausdruck vom Typ „Ganzzahl“
  • Resultierender Ausdruck vom gleichen Typ wie das Objekt

Darüber hinaus wird in Absatz 2 desselben Abschnitts erläutert, dass E1[E2] äquivalent ist zu (*((E1) (E2))). Dies weist darauf hin, dass der Ausdruck E1[E2] als Zeigermanipulation interpretiert werden kann:

  • E1 wird in einen Zeiger auf das Anfangselement eines Arrays umgewandelt.
  • E2 wird hinzugefügt der Zeiger, was zu einem neuen Zeiger führt, der auf das E2-te Element des Arrays zeigt.
  • Die Dereferenzierung des resultierenden Zeigers gibt den Wert des zurück ausgewähltes Array-Element.

Entscheidend ist, dass es im Standard keine Anforderung gibt, dass die Reihenfolge der Argumente für [] sinnvoll ist. Daher wird der Ausdruck 2[arr] als äquivalent zu (*((2) (arr))) behandelt.

  • 2, eine ganze Zahl, wird zu einem Zeiger hinzugefügt, der auf das erste Element von zeigt arr.
  • Der resultierende Zeiger zeigt auf das dritte Element von arr.
  • Dereferenzierung des resultierenden Zeigers (d. h. Zugriff auf arr[2]) weist dem dritten Element den Wert 5 zu.

Daher sind sowohl die Zuweisung als auch die anschließende Behauptung wie erwartet erfolgreich.

Das obige ist der detaillierte Inhalt vonKompiliert und übergibt 2[arr] = 5 die Behauptung in C und C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage