|
Программирование >> Обобщенные обратные вызовы
Задача 28. Ключевые слова, не являющиеся таковыми Сложность: 3 Все ключевые слова равноценны для синтаксического анализатора, но некоторые оказываются равноценнее других. Здесь мы увидим, почему так важно резервирование ключевых слов, а также познакомимся с двумя ключевыми словами, которые вовсе не влияют на семантику программы на С++. Вопрос для новичка 1. Почему большинство языков программирования имеют зарезервированные ключевые слова, которые не могут произвольно использоваться в программе? Вопрос для профессионала 2. Как добавление ключевого слова auto изменяет семантику программы на С++? 3. Как добавление ключевого слова regi ster изменяет семантику программы на С++? Решение Зачем нужны ключевые слова Для С++ очень важно наличие ключевых слов, зарезервированных языком, которые не могут использоваться в качестве имен, например, типов, функций или переменных. 1. Почему большинство языков программирования имеют зарезервированные ключевые слова, которые не могут произвольно использоваться в программе? В случае отсутствия таких зарезервированных слов было бы слишком легко написать программу, которую оказалось бы невозможно скомпилировать из-за ее неразрешимых неоднозначностей. Рассмотрим неправдоподобно простой исходный текст из примера 28-1 я. Пример 28-1(а): корректная программа на С++. int main О { if( true ) ; 1: OK if( 42 ); 2: ок В строках 1 и 2 выполняется проверка условий; если условия истинны (а в приведенном примере так оно и есть), выполняется пустая инструкция. Вряд ли это самый захватывающий исходный текст всех времен и народов. Я даже думаю, что это не самый захватывающий текст из тех, что написаны вами на прошлой неделе. Но, тем не менее, это корректный исходный текст на С+ + , и простейший пример для иллюстрации проблем, которые бы свалились нам на голову, если бы ключевые слова С++ могли использоваться в качестве идентификаторов. Рассмотрим следующий умозрительный исходный текст, только что прибывший в мой кабинет (без тихого хлопка и не сопровождаясь запахом серы) из альтернативного мира, в котором С++ не резервирует ключевые слова, а программисты счастливы использовать их и в качестве идентификаторов. Пока что не будем разбираться в том, как воспримет текст компилятор, и рассмотрим более простой вопрос; как воспримет текст примера 28-15 человек? пример 28-1(6): не С++, но если бы это был он? class if { назовем класс if (не разрешено; но public: если бы это было можно сделать?) if( bool ) {} 3: Гм... конструктор? } > Что означает строка 3? Это просто, -~ может сказать кто-то из читателей. - Мы знаем, что условная инструкция в этом месте лишена смыла, причем имя типа не может быть проверяемым условием, так что понятно, что перед нами конструктор. Может, действительно есть определенный смысл в разрешении использовать ключевые слова в качестве имен - в конце концов, не так трудно предположить, что именно они должны означать! Некоторые из разработчиков языков пошли по этой кривой дорожке... но это очень короткая дорожка! Вы споткнетесь на ней при первой же ситуации наподобие той, что демонстрируется с помощью строк 4 и 5 из следующего исходного текста. пример 28-1(6), продолжение. Вернемся к первоначальному примеру... int main О { if( true ) 4: гмм... и что это означает теперь? if( 42 ); 5: гмм... а это? Что должны означать строки 4 и 5 в этом альтернативном мире? Имеют ли они тот же смысл, что и в рассмотренном нами ранее примере 28-1 я? Или в них используется тип if, который имеет подходящий конструктор, и эти строки означают создание двух безымянных временных объектов? Если вы немного подумаете над .этим вопросом, то быстро сообрази ГС, что даже человек не в состоянии точно ответить на него. Чего же тогда ожидать от компилятора там, где пасует даже человек? Минутку, - может возразить человек, решивший пройти по кривой дорожке до конца, - но ведь можно ввести правило, которое сделает данный код рабочим! Создание временных объектов в строках 4 и 5 только для того, чтобы они тут же были уничтожены, - не слишком полезная вещь, так что мы можем считать, что эго не то, к чему стремился программист, и рассматривать данные строки как обычныс условные инструкции . Я надеюсь, что вы с негодованием отвергнете это решение как непригодный для употребления хак . Тому есть множество причин. 1. Точно так же легко решить, что запись if (true); представляет собой по сути отсутствие операции, что вряд ли являлось целью программиста, так что следует трактовать обе инструкции как объявления временных объектов. 2. Какой бы из вариантов вы ни выбрали, он будет сильно зависеть от того, находится ли класс if в строках 4 и 5 в области видимости или нет. Коротко говоря, наличие таких (скажем прямо - весьма дурно пахнущих) правил в языке следует воспринимать как яркий красный свет, сигнализирующий о серьезных проблемах в дизайне языка. Конечно, есть и другие способы получения неоднозначностей в случае, когда ключевые слова не резервируются. Вот еше один простой случай, который демонстрирует пример 28-1 е. Пример 28-1в: Не С++, но если бы это был он? class someFunctor { public: int operatorO( bool ) { return 42; } SomeFunctor if; назовем переменную if вернемся опять к нашему коду... int main О { if( true ); if( 42 ); 6: ГМ... и что это означает? 7: ГМ... а это? Опять же, что должны означать строки 6 и 7? Являются ли они теми обычными условными конструкциями, которые мы так хорошо знаем и с которыми мы уже встречались в примере 28-1 я? Или здесь используется переменная if, к которой применен оператор operator(), - и даже с совместимыми аргументами! - и в этом случае инструкции в строках 6 и 7 означают i f .operator() (true); и if.operatorO(42);? Я думаю, вполне очевидна невозможность определить, что именно имел в виду программист. Повторяю, это невозможно определить для человека; что уж тогда говорить о компиляторах. Итак, становится ясно, что С++ (как и другие языки программирования) просто вынужден намертво, двухдюймовыми гвоздями прибить значения к некоторым именам. Он вынужден зарезервировать эти имена для собственного использования, поэтому они и называются зарезервированными словами. Ключевые слова С++ Стандарт С++ резервирует в качестве ключевых слов 63 имени, которые перечислены в табл. 28.1. Большинство из этих имен хорошо вам знакомы и ежедневно используются вами. Таблица 28.1. Ключевые слова С++
Кроме того, вместо обычной формы записи, 11 операторов могут использовать запись при помоши слов, например, в условном выражении можно записать and вместо &&. Стандарт резервирует эти слова, так что вы не можете распоряжаться ими для использования в качестве собственных имен. Список этих имен приведен в табл. 28.2. Таблица 28.2. Дополнительные зарезервированные слова not eq and eq or bitand or eq bitor xor compl xor eq Итого, 74 - посчитайте сами! - определенных имени в ваших программах не могут быть использованы вами произвольным образом, в частности, в качестве имен типов, функций или переменных (см. [С++03, §2.11]).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |