Что означает выражение типа arr ['hi there "]? - PullRequest
15 голосов
/ 20 июля 2011

Если a = 3 и b = 5, что это означает?

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);

Я знаю, что arr[4] означает *(arr+4), поэтому мне нужно знать, что означает выражение типа "hi there"?

РЕДАКТИРОВАТЬ - Вопрос, возможно, более ясный:

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

Почему выход выше Hello! how is this? super?

Ответы [ 5 ]

22 голосов
/ 20 июля 2011

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

printf("Hello! how is this? %s\n", "super");

, который будет печатать:

Hello! how is this? super

Демонстрационная версия онлайн: http://ideone.com/PVzUP

Пояснение:

Когда мы пишем char s[]="nawaz;, а затем s[2] означает третий символ в строке s.Мы можем выразить это, написав "nawaz"[2], что также означает третий символ в строке "nawaz".Мы также можем написать 2["nawaz"], что также означает третий символ в строке.В вашем коде printf использует последнюю форму, то есть в форме 2["nawaz"].Однако это необычно.

Так что a["Ya!Hello! how is this? %s\n"] означает 4-й символ в строке (поскольку значение a равно 3), и если вы добавите & перед a, то &a["Ya!Hello! how is this? %s\n"] вернется адрес 4-го символа в строке, это означает, что в printf это становится эквивалентным этому:

Hello! how is this? %s\n

И я надеюсь, что вы можете интерпретировать остальное самостоятельно.

11 голосов
/ 20 июля 2011

Если arr[4] означает *(arr+4), то 4[arr] означает *(4+arr). Поскольку сложение между указателями и целыми числами является коммутативным, они идентичны.

Ответ может быть совсем другим, если вы работаете в C ++ с объектами, которые имеют перегруженные операторы. В этом случае ваш вопрос не будет достаточно полным.

5 голосов
/ 20 июля 2011

Если a и b являются целыми числами, эти две строки эквивалентны:

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
printf(&("Ya!Hello! how is this? %s\n"[a]), &("junk/super"[b]));  

И это интересное чтение: http://www.gotw.ca/gotw/086.htm

3 голосов
/ 20 июля 2011

Тип "hi there" равен const char[9], массив из 9 символов.

Учитывая это, мы можем индексировать в этот массив, используя "hi there"[a], если a находится между 0 и 8.

И, как вы сказали, x[i] эквивалентно *(x + i), *(i + x) и, следовательно, также i[x].Таким образом, мы можем написать "hi there"[a] как a["hi there"], чтобы сбить всех с толку.

0 голосов
/ 20 июля 2011

если a = 3 и b = 5, что это означает

printf (& a ["Ya! Привет! Как это?% S \ n"], & b ["junk / super"]);

Оператор [] в оригинальном определении C является просто операцией смещения, которая в ассемблере переводится как

   x[y] => (addr = x + y; fetch content at addr)

Так что, где x, как правило, указатель, а y - индекс этого указателя, тогда на самом деле не имеет значения, переключаете ли вы их.

Таким образом, код эквивалентен более понятной версии

   printf(&("Ya!Hello! how is this? %s\n"[a]), &("junk/super"[b]));

Или с исключенными a = 3 и b = 5

   printf("Hello! how is this? %s\n", "super");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...