Acceso a matrices por índice en C y C ++

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 sum 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 ++?

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 que E1[E2] es idéntico a (*((E1)+(E2))) . Debido a las reglas de conversión que se aplican al operador binario + , si E1 es un objeto de matriz (de manera equivalente, un puntero al elemento inicial de un objeto de matriz) y E2 es un número entero, E1[E2] designa el elemento E2 -ésimo de E1 (contando desde cero).

No dice nada que requiera el orden de los argumentos para que [] esté cuerdo.

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 progtwigdores 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 progtwigció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 progtwigción cotidiana.