2014 dxdy logo

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

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




 
 Синтаксис C++
Сообщение28.12.2009, 22:43 
Аватара пользователя
Хотелось бы понять логику синтаксиса C++.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

 
 
 
 Re: Синтаксис C++
Сообщение28.12.2009, 23:29 
Аватара пользователя
В учебнике Кернигана и Ричи учат читать такие определения. Там даже пишут простенькую программу, которая переводит эти определения на английский язык.

 
 
 
 Re: Синтаксис C++
Сообщение28.12.2009, 23:59 
Аватара пользователя
meduza в сообщении #276091 писал(а):
В учебнике Кернигана и Ричи учат читать такие определения. Там даже пишут простенькую программу, которая переводит эти определения на английский язык.
Как учат? Я сейчас не могу скачать эту книгу. Можете пояснить на моем примере?

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

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

 
 
 [ Сообщений: 4 ] 


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