1818 Stimmen

Warum ist es bei Arrays so, dass a[5] == 5[a]?

Wie Joel unterstreicht in Stack Overflow-Podcast #34 , in Programmiersprache C (auch bekannt als: K & R), wird diese Eigenschaft von Arrays in C erwähnt: a[5] == 5[a]

Joel sagt, dass es an der Zeigerarithmetik liegt, aber ich verstehe es immer noch nicht. Warum ist a[5] == 5[a] ?

54voto

Peter Lawrey Punkte 511323

Um die Frage wörtlich zu beantworten. Es ist nicht immer wahr, dass x == x

double zero = 0.0;
double a[] = { 0,0,0,0,0, zero/zero}; // NaN
cout << (a[5] == 5[a] ? "true" : "false") << endl;

druckt

false

38voto

Ich habe gerade herausgefunden, dass diese hässliche Syntax "nützlich" sein könnte, oder zumindest sehr lustig zu spielen, wenn man mit einem Array von Indizes umgehen will, die sich auf Positionen im selben Array beziehen. Sie kann verschachtelte eckige Klammern ersetzen und den Code besser lesbar machen!

int a[] = { 2 , 3 , 3 , 2 , 4 };
int s = sizeof a / sizeof *a;  //  s == 5

for(int i = 0 ; i < s ; ++i) {  

    cout << a[a[a[i]]] << endl;
    // ... is equivalent to ...
    cout << i[a][a][a] << endl;  // but I prefer this one, it's easier to increase the level of indirection (without loop)

}

Natürlich bin ich mir ziemlich sicher, dass es dafür keinen Anwendungsfall in echtem Code gibt, aber ich fand es trotzdem interessant :)

30voto

PolyThinker Punkte 5076

Gute Frage/Antworten.

Ich möchte nur darauf hinweisen, dass C-Zeiger und Arrays nicht die dieselbe obwohl der Unterschied in diesem Fall nicht wesentlich ist.

Betrachten Sie die folgenden Erklärungen:

int a[10];
int* p = a;

Sur a.out das Symbol a befindet sich an einer Adresse, die der Anfang des Arrays ist, und das Symbol p befindet sich an einer Adresse, an der ein Zeiger gespeichert ist, und der Wert des Zeigers an dieser Speicherstelle ist der Anfang des Arrays.

23voto

Für Zeiger in C gilt

a[5] == *(a + 5)

und auch

5[a] == *(5 + a)

Daher gilt, dass a[5] == 5[a].

18voto

Ajay Punkte 17373

Das ist keine Antwort, sondern nur ein Denkanstoß. Wenn die Klasse einen überladenen Index/Teilskript-Operator hat, ist der Ausdruck 0[x] wird nicht funktionieren:

class Sub
{
public:
    int operator [](size_t nIndex)
    {
        return 0;
    }   
};

int main()
{
    Sub s;
    s[0];
    0[s]; // ERROR 
}

Da wir keinen Zugang haben zu int Klasse ist dies nicht möglich:

class int
{
   int operator[](const Sub&);
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X