2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу 1, 2, 3, 4  След.
 
 Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:20 
Откуда есть пошла традиция писать type *variable вместо, по-моему, более логичного type* variable? Это всё порча интуиции из-за того как работает typedef? Про третий упомянутый в заголовке вариант даже боюсь спрашивать.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:29 
Сравните:
Код:
int* a, b;

и
Код:
int *a, b;

В первом варианте кажется, что b будет указателем, как и a.
Во втором выглядит именно так, как будет воспринято компилятором: b - простой int, а не указатель.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:40 
Аватара пользователя
Это потому что в C можно писать type *p, v;, и p будет указателем, а v переменной указанного типа. Я не уверен, почему оно так было выбрано, насколько я понимаю, в ранних версиях C типов сначала не было, а потом было соглашение, что по умолчанию переменная имеет тип int. Соответственно, писали просто a, b, *c.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:44 
:shock: Ужас! Спасибо, не знал о таком поведении.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:49 
Аватара пользователя
Я привык писать объявление переменной так же, как потом она будет использоваться. А в тексте программы * p выглядит некрасиво.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:56 
Но таким способом можно обосновать только * и [], когда * и [index] в выражениях — это просто омонимы * и [optional-count] на месте описания.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение16.05.2015, 00:03 
Аватара пользователя
Ну, а надо-то что?

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение16.05.2015, 00:54 
Я бы не ставил вопрос в виде «надо». :-) К тому же, у меня в этой теме только один вопрос и был, и он уже закрыт.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение16.05.2015, 05:24 
arseniiv в сообщении #1015785 писал(а):
Это всё порча интуиции из-за того как работает typedef?


Скорее наоборот typedef использует парсер объявления переменной, только вместо имени переменной заводит имя типа.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 22:22 
Это да, это я постиг годами раньше. :-) Другое дело, что такая работа typedefа, вероятно, выбрана из-за того что более удобно в виде typedef name type-expression не получилось бы из-за этих самых * и [], и способа описания указателя на функцию тоже.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 22:51 
Аватара пользователя
Страуструп во всех своих книжках упорно проводит мысль, что в С++ переменные нужно объявлять максимально близко к месту их использования, а потому необходимость в множественном объявлении отпадает (в отличии от раннего С, где все объявления должны были делаться в начале блока). Поэтому он рекомендует использовать только одиночные объявления переменных, и при объявление указателей писать type* p;

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 23:26 
Аватара пользователя
arseniiv в сообщении #1016563 писал(а):
Другое дело, что такая работа typedefа, вероятно, выбрана из-за того что более удобно в виде typedef name type-expression не получилось бы из-за этих самых * и [], и способа описания указателя на функцию тоже.

Почему не получилось бы?

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 23:53 
Например, как назвать тип x, объявленного как int x[]? Соответствующего типовыражения на C (и на плюсах) написать нельзя. Или, например, назвать тип указателя на функцию.

В C#, для сравнения, массивы уже определяются int[] x, что, по идее, должно работать с using Alias = int[]. В Haskell с синонимами и их созданием всё прозрачно (каждый тип порождает конструктор типа, определение type Alias = терм из конструкторов можно поместить почти где угодно), в Ceylon ещё и синонимы классов и интерфейсов сделали, которыми можно пользоваться в соответствующих контекстах. В двух последних легко построить выражение для типа функции, в первом до .NET Framework 3.5 придётся использовать конструкцию delegate, хотя это может понадобиться и в поздних, если у функции жутко много параметров.

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 03:12 
Аватара пользователя
arseniiv в сообщении #1016593 писал(а):
Соответствующего типовыражения на C (и на плюсах) написать нельзя.

Как это? int []. Так пишут, например, в аргументах функции, не имеющих имени.

Возможно, пробовали typedef newtype oldtype и typedef oldtype newtype, и второе приводило к меньшему количеству ошибок? Впрочем, вряд ли Создатели настолько глубоко заморачивались... Си начинался как мелкая поделка для себя, вместе с BCPL, B, UNIX. Его (и UNIX) бурный успех был неожиданностью для Создателей. Можно представить себе такой мотив, как "использовали готовый кусок синтаксического анализатора".

 
 
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение18.05.2015, 03:16 
Munin в сообщении #1016624 писал(а):
arseniiv в сообщении #1016593 писал(а):
Соответствующего типовыражения на C (и на плюсах) написать нельзя.

Как это? int []. Так пишут, например, в аргументах функции, не имеющих имени.
Но в аргументах функции это просто точный синоним указателя - int*.

На всякий случай, если кто не знает.

 
 
 [ Сообщений: 52 ]  На страницу 1, 2, 3, 4  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group