#c #arrays
#c #массивы
Вопрос:
Что происходит, когда мы обмениваем имя массива и индекс, как индекс[имя массива] в C ? Является ли arrayname[индекс] таким же, как и написание индекса[arrayname]? Какова будет ценность в обоих?
Комментарии:
1. @JohnKugelman Nope. Это то, что одинаково как в C, так и в C .
2. Если массив на самом деле является
std::vector
,std::array
, или каким-либо другим классом, подобным массиву, с перегрузкой оператора, их нельзя поменять местами. Этот трюк не так хорошо переводится на C .3. @JohnKugelman Оп говорит, что у них есть массив, а не вектор. Это работает только с массивом, поэтому они, должно быть, использовали массив.
4. Я имею в виду, что ответ на C должен быть примерно таким: «Если у вас есть простой массив, то
array[index]
иindex[array]
они взаимозаменяемы. Однако этот трюк в целом не работает для других массивоподобных типов, которые перегруженыoperator[]
, какstd::array
илиstd::vector
.» И, конечно, должна быть куча объяснений.5. Мы всегда говорим людям, что C и C — это разные языки. Мы не должны закрывать этот вопрос на C как дубликат вопроса на C. Ответы могут быть разными.
Ответ №1:
Для встроенных типов определение E1[E2]
«идентично (по определению)» *((E1) (E2))
. (цитата из [expr.sub]/1) Таким образом, ответ прост: замена имен не имеет никакого эффекта.
Для пользовательских типов E1
должен быть тип класса с перегрузкой operator[]
, поэтому , если нет каких-то фанковых вещей, вы не можете обмениваться двумя выражениями.
Ответ №2:
Это не имеет никакого эффекта, так arrayname[index]
как является идентичной записью, поскольку index[arrayname]
причина и то, и другое интерпретируется как: *(arrayname index)