2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Синтаксис C++
Сообщение28.12.2009, 22:43 
Аватара пользователя


19/08/07
113
Краснодар
Хотелось бы понять логику синтаксиса C++.

Объявление переменной:

Имя_типа Имя_переменной;

Здесь все понятно.

Далее объявление указателя на переменную:

Имя_Типа * Имя_Переменной;

Должно же быть какое-то согласование с предыдущим правилом. Что здесь считать типом, а что именем переменой? Можно считать, что Имя_типа* есть новый производный тип, тогда все согласуется.

Массив определяется так:

Имя_Типа Имя_Переменной [Размер];

Массив на указатели определяется так:

Имя_Типа * Имя_Переменной [Размер];

Здесь также можно считать, что Имя_типа* есть новый производный тип указателя на тип Имя_типа, тогда все согласуется.

Указатель на массив определяется так:

Имя_Типа (*Имя_Переменной) [Размер];

Здесь я не вижу логики. Аналогично с ссылками на функции. Конечно, эти правила можно зазубрить, но отсутствие логики меня очень расстраивает :(

По-моему, так было бы логичнее:

(Имя_Типа [Размер])* Имя_Переменной;

Так выражение согласуется с правилом объявления переменной: Имя_типа Имя_переменной;


Есть мнение, что определение сущности имеет иметь тот же синтаксис, что и её использование.

Согласно этой идее, нужно представить, что *Имя_Переменной - это как бы прототип операции разыменования и переменная после разыменования имеет тип Имя_Типа. Появляется какая-то логика.

Но операция явного приведения типов все портит:

Имя_Переменной1 = (Имя_Типа)Имя_Переменной2;

Имя_Типа *Имя_Переменной;
Имя_Переменной = (Имя_Типа *) 0хB8000000;

В последнем выражении Имя_Типа* уже рассматривается как новый тип, к которому приводим. Это как-то не очень согласуется с этим интуитивным предполагаемым правилом.

Может все-таки кто-то может объяснить?

 Профиль  
                  
 
 Re: Синтаксис C++
Сообщение28.12.2009, 23:29 
Заслуженный участник
Аватара пользователя


03/06/09
1497
В учебнике Кернигана и Ричи учат читать такие определения. Там даже пишут простенькую программу, которая переводит эти определения на английский язык.

 Профиль  
                  
 
 Re: Синтаксис C++
Сообщение28.12.2009, 23:59 
Аватара пользователя


19/08/07
113
Краснодар
meduza в сообщении #276091 писал(а):
В учебнике Кернигана и Ричи учат читать такие определения. Там даже пишут простенькую программу, которая переводит эти определения на английский язык.
Как учат? Я сейчас не могу скачать эту книгу. Можете пояснить на моем примере?

Конечно, можно как-то формально это преобразовать, но хочется иметь логичную и понятную мнемонику.

 Профиль  
                  
 
 Re: Синтаксис C++
Сообщение29.12.2009, 00:25 
Заслуженный участник
Аватара пользователя


03/06/09
1497
Не вижу смысла перписывать сюда весь параграф ($\S 5.12$ в моём издании), книга легко ищется в гугле. Но если вкрадце, то определения эти начинают читаться "изнутри" (с имени объявляемой переменной или функции) и постепенно раскручиваются. Приоритеты [] и () выше, чем *, когда это не устраивает -- используют явно круглые скобки.
Напр. int *f() означает, что f -- это функция (т. к. () приоритетней *), возвращающая указатель (*) на int.
int (*f)() значит, что f -- это указатель (т. к. явно скобками указали предпочтение звездочке) на функцию (читаем ()), возвращающую int.
Ну и аналогично читаются определения любой сложности:
int (*(*x[3])())[5] значит, что x -- это массив из 3 указателей на функции, возвращающие указатель на массив из 5 интов.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

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



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

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


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

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