|
Программирование >> Обобщенные обратные вызовы
Это самые длинные последовательности, которые мы можем получить, потому что и I I { I I I должны быть некорректны исходя из тех же рассуждений, которые мы применяли к последовательности М&&&&. Но в этот раз мы не можем добавить дополнительные символы < или I, чтобы получить последовательности из пяти символов, поскольку унарные операторы < и не существуют. Дополнительный вопрос А сколько вопросительных знаков (?) вы сможете разместить подряд в строке программы на С++? Подумайте немного над этим вопросом, прежде чем читать дальше. Этот вопрос сложнее, чем кажется на первый взгляд. Есть ли у вас ответ? Вы можете решить, что ответ - один, поскольку в С++ имеется только одна допустимая лексема, включающая вопросительный знак - тернарный оператор ?:. Да, есть только одно средство в языке, которое использует вопросительный знак, но есть много, друг Горацио, вещей в трансляторах и препроцессорах, которые и не снились синтаксическим правилам... В частности, помимо прочего, С++ это еще и препроцессор, а не только язык. Для символа ? правильный ответ - три. Например: 1???-0:0; Этот вопрос труднее в первую очередь потому, что он нарушает правило максимального глотка. Три вопросительных знака ??? не интерпретируются как лексемы ?? и ?. Почему? Потому что ??- - это триграф, а триграфы обрабатываются до лексического разбора, и даже до обработки директив препроцессора. Если до этого вы не слышали о триграфах - не волнуйтесь, это всего лишь означает, что вы никогда не имели дело с экзотическими клавиатурами и не читали задачу 32. Триграф - это альтернативный способ ввода некоторых символов в исходном тексте (в частности, #, \, л, [> ], I, {, } и ~) на клавиатурах, которые не имеют клавиш для данных символов. В нашем случае задолго до лексического анализа триграф ??- заменяется символом ~, оператором побитового отрицания. Таким образом, исходный текст превращается в следующий: 1?~0:0; который при лексическом анализе разбивается на лексемы 1 ? ~ О : О ; и означает 1 ? (~0) : О ; Резюме Триграфы - средство, унаследованное из С и редко при.менясмое на практике, но оно оказалось приш1Ипиально полезным с политической точки зрения в процессе стандартизации (не спрашивайте, почему). Просто примите к сведению наличие такого редко используемого средства. За.мечу, что в некоторых компиляторах поддержка трифафов по умолчанию выключена, и, как было сказано в одной документации по поводу опции, включающей поддержку фифафов, она включает эту неудобную и редко используемую возможность стаццарта С . К этому комментарию мало гro можно добавить. Изучение конкретных примеров Копаться в чужом коде, наверное, некрасиво. Но зато очень интересно. Этот завершающий раздел посвящен новой теме. Мы рассмотрим фрагменты реального опубликованного кода, обсудим его дизайн и стиль кодирования, его слабые и сильные стороны, и подумаем над тем, как разработать более совершенную версию. Можно только удивляться, как много можно сделать с кодом, который был написан, проверен и откорректирован экспертами. Наслаждаясь чужими исходными текстами, не забывайте: то, что мы будем делать с чужим текстом, вполне применимо и к вашим программам. Задача 34. Индексные таблицы Сложность: 5 Индексные таблицы представляют собой полезную идиому, так что стоит поближе познакомиться с этой технологией. Но насколько эффективно мы сумеем ее реализовать? Вопрос для новичка 1. Кто выигрывает от ясного, понятного исходного текста? Вопрос для профессионала 2. Приведенный далее исходный текст представляет интересную и, несомненно, полезную идиому создания индексных таблиц над существующими контейнерами. Более детальную информацию вы можете почерпнуть из статьи [HicksOO]. Оцените приведенный далее исходный текст и найдите: а) механические ошибки, такие как неверный синтаксис или непереносимые соглашения; б) стилистические улучшения, которые могут повысить ясность, степень повторного использования и сопровождаемости исходного текста. Программа sort iclxtbl (...) выполняет перестановку индексов в таблице #1nclude <vector> #include <algorith> template <class RAlter> struct sort idxtbl pair RAlter it; int i; bool operator<( const sort .idxtbl pai r& s ) { return (*it) < (*(s.it)); } void set( const RAIter& it, int i ) { it= it; i= i; } sort .idxtbl pai r() {} template <class RAlter> void sort idxtbl( RAlter first, RAlter 1ast, int* pidxtbl ) int iDst = last-fi rst; typedef std::vector< sort idxtbl pair<RAlter> > v; V v( iDst ); int i=0; RAlter it = first; v: : i terator vi t = v.begin(); for( i=0; it<last; it++, vit++, i++ ) (*vit).set(it,i); std: :sort(v.begin() , v.endO); int *pi = pidxtbl; vit = V.beginC); for( ; vit<v.end(); pi++, vit++ ) *pi = (*vit).i:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.002
При копировании материалов приветствуются ссылки. |