2012-01-18 14 views
33

Duplicar posible:
In C arrays why is this true? a[5] == 5[a]¿Por qué funciona esto? Ilógica acceso a matriz

Un amigo mío está aprendiendo C++, por primera vez, y me envió este fragmento:

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]; 
} 

En una vistazo, le dije que no funcionaría - pensé que no compilaría, o al menos daría lugar a una violación de acceso, ya que foo no es un matriz bidimensional, a lo que él respondió que sí.

Lo intenté por mí mismo, y para mi sorpresa, el fragmento funcionó perfectamente bien. La pregunta es: ¿por qué?

De acuerdo con la lógica, el sentido común y las buenas prácticas, la sintaxis debe ser bar[foo[i]].

Me da vergüenza admitir que no tengo idea de lo que está pasando. ¿Qué hace que foo[i][bar] sea una sintaxis válida en este caso?

+16

Esto no es un duplicado exacto, y la respuesta es bastante interesante. La causa raíz de ambas preguntas es la misma, pero eso es cierto para cientos de preguntas en StackOverflow. –

+1

BTW: Solo estaría de acuerdo con la salida si estuviera haciendo este tipo de cosas ... – stefaanv

+0

Curiosamente, esta realmente tiene sentido si uno lee la pregunta vinculada, pero sigue siendo exactamente tan ilógico como lo es cuando no lo haces lo entiendo; la parte ilógica simplemente cambia de "cómo funciona esto" a "por qué dejaron que esto funcionara". –

Respuesta

35

En términos simplistas, el acceso de un elemento de matriz en C (y en C++, cuando [] no está sobrecargado) es como sigue:

x[i] = *(x + i) 

Así pues, con esto y un poco de aritmética. ..

foo[i][bar] 
= (foo[i])[bar] 
= (*(foo + i))[bar] 
= *((*(foo + i)) + bar) 
= *(bar + (*(foo + i))) 
= bar[*(foo + i)] 
= bar[foo[i]] 

No utilice este "hecho" sin embargo. Como has visto, hace que el código sea ilegible y el código ilegible no se puede mantener.

Cuestiones relacionadas