Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правило право-лево. Читаем сложные структуры языка, может в FAQ?) 
:(
    Опции темы
jonie
Дата 7.1.2008, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата

А как вообще фоpмулиpуется основной пpинцип pазбоpа сложных синтаксических констpукций языка, навpоде "указатель на функцию, возвpащающую указатель на массив из тpёх указателей на функции, возвpащающие значение int"? 

Давно и чётко формализовано в виде правила "право-лево". Всё предельно просто. Имеем: 
() - функция, возвращающая...
[] - массив из...
* - указатель на...

Процесс разбора итеративный: 
Первым делом находим имя, от которого и будем плясать. Пляски начинаются со слов "Имя есть..." 
Следующий шаг - шаг вправо. Что там у нас справа? Если (), то говорим, что "Имя есть функция, возвращающая...". (если промеж скобок что-то есть, то "Имя есть функция, принимающая то, что между скобок, и возвращающая...") Если там [], то "Имя есть массив из..." И таким вот образом мы идём вправо до тех пор, пока не дойдём до конца объявления или правой ) скобки. Тут тормозим... 
...и начинаем танцевать влево. Что у нас слева? Если это что-то не из приведённой выше таблицы (то есть не (), [], *), то просто добавляем к уже имеющейся расшифровке. Если же там что-то из этих трёх символов, то добавляем то, что написано в таблице. И так танцуем до тех пор, пока не дотанцуем до конца (точнее - начала объявления) или левой ( скобки. Если дошли до начала, то всё готово. А если дошли до (, то по уже означенной итеративности переходим к шагу 2 - пляски вправо продолжаем. 

Пример: 
        int (*(*(*fptr)())[3])();
                  ^^^^
    
Hаходим имя и записываем "fptr есть..."
Шаг вправо, но там ), потому идём влево 
        int (*(*(*fun)())[3])();
                 ^
    
и получаем "fptr есть указатель на..." 
Продолжаем ехать влево, но тут (. Идём вправо 
        int (*(*(*fun)())[3])();
                      ^^
    
получаем "fptr есть указатель на функцию, возвращающую..." Снова ), опять влево. 
Получаем 
        int (*(*(*fun)())[3])();
               ^
    
"fptr есть указатель на функцию, возвращающую указатель на..." Слева опять (, идём вправо. 
Получаем 
        int (*(*(*fun)())[3])();
                         ^^^
    
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх..." И снова справа ), отправляемся влево 
Получаем 
        int (*(*(*fun)())[3])();
             ^
    
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на..." Снова разворот вправо по причине ( 
Получаем 
        int (*(*(*fun)())[3])();
                             ^^
    
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на функции, возвращающие..." Тут конец описания, поехали влево и получили окончательную расшифровку этой каракули 
        int (*(*(*fun)())[3])();
        ^^^
    
"fptr есть указатель на функцию, возвращающую указатель на массив из трёх указателей на функции, возвращающие int" 
Именно то, чего ты и хотел. Просто?

взято оттуда:
http://www.kalinin.ru/programming/cpp/17_07_00.shtml

может пригодиться кому) а то валили помниться нас по С\С++ сложными вещями)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
JackYF
Дата 7.1.2008, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 6
Всего: 162



Да, имхо, стоит добавить в FAQ.

Сам, правда, такое читать не люблю и разбобью, скорее всего, на несколько typedef'ов. Это же ужас какой, заново каждый раз эту лабуду парсить.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
archimed7592
Дата 7.1.2008, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



1. В статьи - об этом не так уж часто спрашивают(за полтора года, что я на форуме - вообще не помню, чтобы спрашивали).
2. В общие вопросы - новичкам это не нужно.
3. Нужно, чтобы кто-то оформил форматирование - кто возьмётся, запостите результат тут.
4. Нужно найти ссылку на английский оригинал(я её читал именно на англ.) и также дать её в тексте.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Fazil6
Дата 7.1.2008, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 7
Всего: 60



Цитата(JackYF @  7.1.2008,  14:21 Найти цитируемый пост)
Да, имхо, стоит добавить в FAQ.

уже давно добавлено
http://worldcpp.vingrad.ru/

Это сообщение отредактировал(а) Fazil6 - 7.1.2008, 22:51
PM MAIL   Вверх
Любитель
Дата 8.1.2008, 00:44 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



Fazil6, речь про форумский фак. По нему работает поиск и пр. WorldCPP - это немного другое smile


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.