2015-08-14 4 views
2

Я пытаюсь решить эту загадку:Головоломка: «[] симметрична»?

int direction = 1; 
char direction_name = direction["nsew"]; 

Как почему он компилируется на первом месте, что именно он пытается доказать и то, что он используется?


Я обнаружил этот код на сайте, без соответствующего объяснения, кроме «[] является симметричным». Я имею в виду то, что я должен делать с этой информацией ..

+0

для любого массива или указателя 'p',' i [p] 'и' p [i] 'приходят к тому же значению, то есть' * (p + i) '. первая форма совершенно верна, и вы можете найти ее в стандарте. но на самом деле это слишком базар, поэтому вы можете видеть его редко. – HuStmpHrrr

ответ

4

Этот код эквивалентен:

#include <stdio.h> 

int main(void) { 
    char direction_name = 1["nsew"]; 
    printf("[%c]\n",direction_name); 
    return 0; 
} 

, который will print [с], потому что

char direction_name = 1["nsew"]; // "nsew" is string literal, i.e. an array 
           // of 5 chars 'n' 's' 'e' 'w' '\0' 

равна

char direction_name = "nsew"[1]; 

, а также

char direction_name = *("nsew" +1); 

Поэтому [] симметрична в том смысле, что

x[y] == y[x] // if conditions given in C standard 6.5.2.1/2 are met 

Вы можете думать о [] в качестве симметричного соотношения в алгебре (при предположениях от 6.5.2.1 § 2):

enter image description here

Или вы можете думать о [] как линейное отображение (преобразование, функционал) между reflexive (Banach) линейными пространствами V и V **, если хотите:

x[f] = [f,x] = f[x] 

стандарта С n1124 6.5.2.1 § индексацией массивами (акцент основного)

постфиксного выражением, за которым следует выражение в квадратных скобках [] является подстрочным обозначением элемента объекта массива. Определение индексного оператора [] состоит в том, что E1[E2] идентичен (*((E1)+(E2))).Из-за правило преобразования, которые применяются к бинарному оператору +, если E1 является объектом массива (что эквивалентно, указатель на начальный элемент массива объекта) и E2 является целым числом , E1[E2] обозначает E2 -го элемент от E1 (с нуля).

+0

Ahh .. это выглядит странно. Именование было довольно запутанным для меня. – Malina

3

Следующее утверждение:

char direction_name = direction["nsew"]; 

эквивалентно:

char direction_name = "nsew"[direction]; 

, а также:

char direction_name = *("nsew" + direction); // note that addition is commutative 

direction имеет целочисленное значение 1, поэтому вы получают вторую букву (в C массивах индексируются с нуля) строка литерала"nsew" (это тип массива char[5]), то есть 's' знак.

+0

Можете ли вы также объяснить, в каком смысле они «симметричны». Оранжевый и банан не может быть одним и тем же без соответствующего объяснения. Как .. 'printf ("% i "," asdf "[1] == 1 [" asdf "]);' означает симметричный – Malina

+1

@Malina: они симметричны, потому что добавка коммутативна. Выражение 'a [b]' является таким же, как '* (a + b)', используя нотацию указателя, что эквивалентно '* (b + a)', что подразумевает 'b [a]'. –