c++ - tipos - que es una matriz en programacion
Acceso a matrices por índice[matriz] en C y C++ (2)
Existe una pequeña pregunta capciosa que a algunos entrevistadores les gusta preguntar por cualquier razón:
int arr[] = {1, 2, 3};
2[arr] = 5; // does this line compile?
assert(arr[2] == 5); // does this assertion fail?
Por lo que puedo entender, a[b]
se convierte a *(a + b)
y como la suma es conmutativa, en realidad no importa su orden, por lo que 2[a]
es realmente *(2 + a)
y eso funciona bien .
¿Está garantizado que esto funcionará según las especificaciones de C y / o C ++?
En general, 2[a]
es idéntico a a[2]
y se garantiza que es equivalente tanto en C como en C ++ (suponiendo que no haya sobrecarga del operador), porque como se ha dicho, se traduce en *(2+a)
o *(a+2)
, respectivamente. Como el operador más es conmutativo, las dos formas son equivalentes.
Aunque las formas son equivalentes, por el bien de todos los programadores de mantenimiento sagrados (y futuros), prefieren la forma "a [2]" sobre la otra.
PD, si te preguntan esto en una entrevista, por favor, venga de manera exacta en nombre de la comunidad de C / C ++ y asegúrese de pedirle al entrevistador que haga una lista de todas las secuencias de trigrafos como una condición previa para dar su respuesta. Tal vez esto lo desencantaría de hacer tales preguntas (inútiles, con respecto a la programación de todo ) en el futuro. En el extraño caso de que el entrevistador realmente conozca las nueve secuencias de trigrafos, siempre puede intentar otra vez lanzarles una pregunta sobre el orden de destrucción de las clases de base virtuales, una pregunta que es completamente irrelevante para la programación cotidiana.
Sí. 6.5.2.1 párrafo 1 (estándar C99) describe los argumentos para el operador []
:
Una de las expresiones tendrá el tipo "puntero al
type
objeto", la otra expresión tendrá un tipo de entero, y el resultado tendrá el tipo "type
".
6.5.2.1 párrafo 2 (énfasis añadido):
Una expresión de post fi x seguida de una expresión entre corchetes
[]
es una designación con subíndice de un elemento de un objeto de matriz. La definición del operador de subíndice[]
es queE1[E2]
es idéntico a(*((E1)+(E2)))
. Debido a las reglas de conversión que se aplican al operador binario+
, siE1
es un objeto de matriz (de manera equivalente, un puntero al elemento inicial de un objeto de matriz) yE2
es un número entero,E1[E2]
designa el elementoE2
-ésimo deE1
(contando desde cero).
No dice nada que requiera el orden de los argumentos para que []
esté cuerdo.