Что означает выражение, подобное 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");