Что означает выражение, подобное arr ['' hi there?]?

Если 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?

Ответы

Ответ 1

Это означает, что 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"]. Однако это необычно.

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

Hello! how is this? %s\n

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

Ответ 2

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

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

Ответ 3

Если 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

Ответ 4

Тип "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"], чтобы запутать всех.

Ответ 5

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

printf (& a [ "Ya! Hello!, как это?% 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");