Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2014, 12:30   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,601
По умолчанию Для чего существует коммутативность array[2] == 2[array]

Привет всем! Появился вопрос. Почему в Си выражения
Код:
array[2]=10
и
2[array]=10
эквивалентны? Точнее как это используется в программировании? Какой случай требует именно второй способ(2[array])?

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 31.10.2014 в 12:32.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 31.10.2014, 13:09   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Точнее как это используется в программировании?
Никак.

http://stackoverflow.com/questions/5...ray-in-c-and-c

Цитата:
In general 2[a] is identical to a[2] and this is guaranteed to be equivalent in both C and C++ (assuming no operator overloading), because it translates into *(2+a) or *(a+2), respectively. Because the plus operator is commutative, the two forms are equivalent.

Although the forms are equivalent, please for the sake of all that's holy (and future maintenance programmers), prefer the "a[2]" form over the other.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 31.10.2014 в 13:14.
Alex11223 вне форума Ответить с цитированием
Старый 31.10.2014, 22:19   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Никак.
Та ладно... так приятно потроллить крутых программеров на собеседовании этой записью. А уж когда показываешь, что оно работает...
p51x вне форума Ответить с цитированием
Старый 31.10.2014, 22:36   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
2[a] is identical to a[2]
Как-то не вяжется с постулатом не использовать на первом месте цифру в имени переменной или обращении к ней...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.10.2014, 22:38   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут имя? Там же написано во что оно преобразуется. А про "или обращении к ней" это вы сами придумали. И что такое "обращения"?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 31.10.2014 в 22:40.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 01:19   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

_PROGRAMM_

Почему в Си выражения

array[2]=10
и
2[array]=10

эквивалентны?


так получилось...
Rififi вне форума Ответить с цитированием
Старый 01.11.2014, 08:57   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Причем тут имя?
При том что так нельзя писать ни в одном языке, а единица объекта имеет свое имя (лямбды не считаем).
В случае с 2[a] имя тоже есть, только в виде индекса. Я говорю о разрыве шаблонов, а не о том во что оно преобразуется.
Давай может еще так разрещим?:
Код:
{break; }(true)if
Ну так, на всяки случай, чтоб кулхацкеры себя не чувствовали обиженными?
Цитата:
А про "или обращении к ней" это вы сами придумали. И что такое "обращения"?
Это не я придумал, а многолетнее становление ИТ сферы. Если ты не знаешь что означает фраза "обратится к переменной" то я увы не смогу тебе ничего обьяснить, и меня ты не поймешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.11.2014, 12:57   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну я думаю основная причина запрета переменных начинающихся с цифры в том, чтобы нельзя было создать переменную состоящую только из цифр и путать ее с числами. А 1abc заодно запретили, чтобы облегчить парсинг (особенно с учетом того, что 40 лет назад они не были так развиты).

2[a] сомневаюсь, что когда-либо рекомендовалось к использованию. Наверно просто так получилось, а потом пришлось оставить для совместимости.

Цитата:
обратится к переменной
Ну обращаемся мы перемененной a, сдвинувшись на определенное числа байт.
Массивы в С все-таки же сильно похожи на указатели, а не на список переменных как в некоторых других языках.

Цитата:
Давай может еще так разрещим?
А давай так (в С++ не работает, только С):
Код:
int func (p, p2)
    void *p;
    int  p2;
{
    printf("Hello!\n");
    return 0;
}
или так:
Код:
int x = 'ABCD';
или вот так:
Код:
#include <stdio.h>

int main()
{
    http://programmersforum.ru
    printf("Hello World\n");
    goto http;
    
    return 0;
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 01.11.2014 в 13:00.
Alex11223 вне форума Ответить с цитированием
Старый 01.11.2014, 19:10   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А давай так (в С++ не работает, только С):
Ну я понимаю, это фривольность Си )
Но как бы там ни було пределы маразма всетко должны быть хотя бы достижимы. А в случае с 2[а] это как-то уже перебор.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.11.2014, 12:27   #10
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Из всех вариантов применения в таком, имхо, смотрится лучше всего:
Код:
hexDigit["0123456789abcdef"]
Особенно в таком варианте:
Код:
std::string NumberToHexString(auto x)
<%
	decltype(NumberToHexString(x)) s;
	<:]{%>;
	do s.push_back((017 bitand x)??("0123456789abcdef":>);
	while (??--1 not_eq (x >>= 4));
	return <%s.rbegin(), s.rend()%>;
%>
Somebody вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как по указателю на массив узнать массив чего это(array of string/integer/int64...) WhiskasTM Общие вопросы Delphi 4 07.01.2013 21:11
Записать Array of AnsiChar в Array of AnsiChar Anton911 Общие вопросы Delphi 4 07.05.2012 21:58
Array в С banl Помощь студентам 0 15.04.2011 03:22
str->array & array->str LeoN PHP 6 06.07.2010 22:38
Array или не array Димарик Общие вопросы Delphi 4 18.06.2007 15:16