2012-01-18 8 views
33

Eventuali duplicati:
In C arrays why is this true? a[5] == 5[a]Perché funziona? Illogica di accesso agli array

Un mio amico sta imparando C++ per la prima volta, e mi ha mandato questo frammento:

int foo[] = { 3, 38, 38, 0, 19, 21, 3, 11, 19, 42 }; 
char bar[] = " abcdefghijklmnopqrstuvwxyz-,.!?-_"; 
for (int i = 0; i < 10; ++i) { 
    std::cout << foo[i][bar]; 
} 

A colpo d'occhio, gli ho detto che non funzionerà - ho pensato che non si sarebbe compilato, o almeno avrebbe comportato una violazione di accesso, come foo non è un matrice bidimensionale, a cui ha risposto che lo fa.

Ho provato per me stesso, e con mia sorpresa, il frammento funzionava perfettamente bene. La domanda è: perché?

In base alla logica, al buon senso e alle buone pratiche, la sintassi deve essere bar[foo[i]].

Mi vergogno di ammettere che non ho idea di cosa stia succedendo. Cosa rende la sintassi valida foo[i][bar] in questo caso?

+16

Questo non è un duplicato esatto e la risposta è piuttosto interessante. La causa principale di entrambe le domande è la stessa, ma è vero per centinaia di domande su StackOverflow. –

+1

BTW: Sarei solo d'accordo con l'output se farei questo genere di cose ... – stefaanv

+0

Divertente, questo ha davvero senso se si legge la domanda collegata, eppure rimane esattamente illogico come lo è quando non si fa ' lo capisco; la parte illogica si sposta semplicemente da "come funziona" a "perché hanno lasciato che questo lavoro". –

risposta

35

In termini semplicistici, l'accesso di un elemento di matrice in C (e in C++, quando [] non è sovraccaricato) è il seguente:

x[i] = *(x + i) 

Quindi, con questo e un po 'di aritmetica. ..

Non utilizzare questo "fatto" però. Come hai visto, rende il codice illeggibile e il codice illeggibile non è gestibile.

Problemi correlati