Подтвердить что ты не робот

Почему эта ссылка на массив C выглядит некорректной?

Ниже приведен фрагмент кода, скопированный с веб-сайта . Значение, заданное для направления, печатает соответствующий символ из "nsew". Например, вывод этого кода - символ w.

Мне интересно, как это работает.

#include<stdio.h>
void main (void){
   int direction = 3;
   char direction_name = direction["nsew"];
   printf("%c",direction_name);
}
4b9b3361

Ответ 1

Это связано с тем, что оператор индекса массива является коммутативным, т.е. это:

const char *p = "Hello";
char x = p[0];

Является эквивалентным

const char *p = "Hello";
char x = 0[p];

Странно, да? В вашем случае вы индексируете третью позицию строкового литерала (который является массивом) "nsew".

some_ptr[n] эквивалентно *(some_ptr + n), и поскольку сложение является коммутативным, оно также эквивалентно *(n + some_ptr). Отсюда следует, что n[some_ptr] также является эквивалентным выражением.

Я бы не рекомендовал использовать эту "функцию", однако... серьезно, не делайте этого.

Ответ 2

Оператор [] имеет ту же семантику, что и арифметика указателя. Итак, a[i] эквивалентно *(a + i), что эквивалентно *(i + a), что эквивалентно i[a]:

So direction["nsew"] == "nsew"[direction] == "nsew"[3] == 'w'