2016-05-18 7 views
2

Kann mir jemand erklären, warum das möglich ist? Ich verstehe, dass a ist das gleiche wie & a [0] und zum Beispiel verstehe ich auch, dass * (a + 1) ist ein zweites Element und ich bin in der Lage, * ((a + i) + j) Techniken zu verwenden, Aber zum ersten Mal in meinem Leben sah ich Code wie diesen und ich bin jetzt verwirrt. Ich weiß, dass Ausgabe das vierte Element eines Arrays ist. Aber kann mir jemand erklären, warum das möglich ist?C++ Problem über Arrays

#include<iostream> 
int a[] = {1,2,3,4,5}; 
std::cout << (3)[a] << std::endl; 
+0

Wichtiger Hinweis, der Ihnen einige zukünftige Verwirrung ersparen kann: 'a' ist nicht dasselbe wie' & a [0] '. Es kann auf die gleiche Weise verwendet werden, kann aber auch auf verschiedene Arten verwendet werden. Zum Beispiel gibt 'sizeof (a)' die Größe des Arrays in Bytes zurück. 'sizeof (& a [0])' gibt die Größe eines Zeigers zurück. – user4581301

Antwort

10

Der binäre Ausdruck:

x[y] 

ist so definiert, gleich zu sein:

*(x+y) 

(in Abwesenheit von operator [] Überlastungen).

3+a ist das gleiche wie a+3, also 3[a] ist das gleiche wie a[3].

Im Zusammenhang mit 3+a verfällt der Name des Arrays a zu einem Zeiger auf sein erstes Element, also versuchen wir, einen Zeiger und eine Ganzzahl mit dem eingebauten Additionsoperator hinzuzufügen. The latest draft of C++14 sagt in Abschnitt 5.7 [expr.add] para 4:

Wenn ein Ausdruck, den Integraltyp hat hinzugefügt oder von einem Zeiger subtrahiert wird, das Ergebnis die Art hat des Zeigeroperanden. Wenn der Zeigeroperand auf ein Element eines Arrays zeigt und das Array groß genug ist, zeigt das Ergebnis auf einen Elementversatz vom ursprünglichen Element, sodass die Differenz der Indizes der resultierenden und ursprünglichen Arrayelemente dem Integralausdruck entspricht. Mit anderen Worten, wenn der Ausdruck P auf das i-te Element eines Array-Objekts zeigt, sind die Ausdrücke (P) + N (äquivalent N + (P)) und (P) -N (wobei N den Wert n hat Punkt) jeweils die i + n-ten und die i - n-ten Elemente des Arrays Objekts, sie existieren

bereitgestellt

Dies ist sehr nahe an den Text des C++ 14-Standard, aber Dieses Verhalten ist seit C89 (und tatsächlich seit BCPL in den 70er Jahren) stabil.

Having said that, wenn Sie Code wie folgt finden den Autor jagen und schlug ihn über den Kopf mit einem Hinweis-bat. Es ist sehr einfach C++ zu schreiben, das niemand (einschließlich sich selbst nach einer Woche) lesen kann - und das nützt niemandem.

+0

Könnten Sie bitte erklären, warum 3 + a ist das gleiche wie eine + 3? Funktioniert hier standardmäßig der Operator +, der zum Beispiel definiert ist: const int & operator + (const int & n, int [] arr) und im selben Moment ist operator + definiert: const int & operator + (int [] arr, const int & n)? Ist mein Verständnis für diesen Schritt gut? – user2667455

+0

Standardmathematik. 10 + 3 = 3 + 10. Der einzige Unterschied hier ist, dass wir eine Adresse anstelle von 10 verwenden. Das Hinzufügen von n zu einem Zeiger bewegt Sie um n Elemente, als ob der Zeiger ein Array wäre, genau wie 'Zeiger [n]' würde. – user4581301

+0

@ user2667455: Der Additionsoperator ist sowohl für Zeiger + Zeiger als auch Zeiger + Zeiger definiert (und bedeutet dasselbe). Ich habe ein Zitat aus dem Standard hinzugefügt, um zu verdeutlichen. –