Что происходит, когда мы меняем имя массива и индекс, как index[имя массива] в C ?

#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)