Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Правило право-лево. Читаем сложные структуры языка


Автор: jonie 7.1.2008, 15:01
Цитата

А как вообще фо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

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

Автор: JackYF 7.1.2008, 15:21
Да, имхо, стоит добавить в FAQ.

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

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

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

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

Автор: Любитель 8.1.2008, 00:44
Fazil6, речь про форумский фак. По нему работает поиск и пр. WorldCPP - это немного другое smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)