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 
Заслуженный участник


27/04/09
28128
Откуда есть пошла традиция писать type *variable вместо, по-моему, более логичного type* variable? Это всё порча интуиции из-за того как работает typedef? Про третий упомянутый в заголовке вариант даже боюсь спрашивать.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:29 
Заслуженный участник


04/05/09
4589
Сравните:
Код:
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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Это потому что в 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 
Заслуженный участник


27/04/09
28128
:shock: Ужас! Спасибо, не знал о таком поведении.

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


30/01/06
72407
Я привык писать объявление переменной так же, как потом она будет использоваться. А в тексте программы * p выглядит некрасиво.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение15.05.2015, 23:56 
Заслуженный участник


27/04/09
28128
Но таким способом можно обосновать только * и [], когда * и [index] в выражениях — это просто омонимы * и [optional-count] на месте описания.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение16.05.2015, 00:03 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ну, а надо-то что?

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение16.05.2015, 00:54 
Заслуженный участник


27/04/09
28128
Я бы не ставил вопрос в виде «надо». :-) К тому же, у меня в этой теме только один вопрос и был, и он уже закрыт.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение16.05.2015, 05:24 


11/12/14
893
arseniiv в сообщении #1015785 писал(а):
Это всё порча интуиции из-за того как работает typedef?


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

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 22:22 
Заслуженный участник


27/04/09
28128
Это да, это я постиг годами раньше. :-) Другое дело, что такая работа typedefа, вероятно, выбрана из-за того что более удобно в виде typedef name type-expression не получилось бы из-за этих самых * и [], и способа описания указателя на функцию тоже.

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 22:51 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Страуструп во всех своих книжках упорно проводит мысль, что в С++ переменные нужно объявлять максимально близко к месту их использования, а потому необходимость в множественном объявлении отпадает (в отличии от раннего С, где все объявления должны были делаться в начале блока). Поэтому он рекомендует использовать только одиночные объявления переменных, и при объявление указателей писать type* p;

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 23:26 
Заслуженный участник
Аватара пользователя


30/01/06
72407
arseniiv в сообщении #1016563 писал(а):
Другое дело, что такая работа typedefа, вероятно, выбрана из-за того что более удобно в виде typedef name type-expression не получилось бы из-за этих самых * и [], и способа описания указателя на функцию тоже.

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

 Профиль  
                  
 
 Re: Объявления указателей: T* e vs. T *e vs. T * e [C]
Сообщение17.05.2015, 23:53 
Заслуженный участник


27/04/09
28128
Например, как назвать тип 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 
Заслуженный участник
Аватара пользователя


30/01/06
72407
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 
Заслуженный участник


04/05/09
4589
Munin в сообщении #1016624 писал(а):
arseniiv в сообщении #1016593 писал(а):
Соответствующего типовыражения на C (и на плюсах) написать нельзя.

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу 1, 2, 3, 4  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group