Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

110 Глава 2

потому относится к глобальному контексту. В примере объявляется переменная suit типа Suit и размещает в ней значениеследующим оператором:

Квалификация имени константы Clubs именем типа Suit существенна; без нее компилятор не может распознать Suit.

Если вы посмотрите на вывод, то увидите, что значение переменной suit отобра- жается как имя соответствующей константы, в первом случае — Clubs. Чтобы полу- чить константное значение, соответствующее объекту, вы должны явно привести его к типу int, как в следующем операторе:

Из вывода программы видно, что константам перечисления присвоены значения, начиная с 0. Фактически вы можете изменить тип, используемый для перечислимых констант. В следующем разделе мы посмотрим, как это делается.

Спецификация типа перечислимых констант

Константы в перечислениях C++/CLI могут относиться к любому из следующих типов:

Чтобы специфицировать тип констант перечисления, название типа констант за- писывается после имени типа перечисления и отделяется двоеточием — как и в пере- числениях "родного" С++. Например, чтобы специфицировать константу перечисле- ния как char, потребуется написать:

Константы в перечислении будут иметь тип Char, а лежащий в их основе фунда- ментальный тип будет char. Первая константа по умолчанию соответствует кодовому значению 0, а все последующие присваиваются по порядку возрастания. Чтобы полу- чить лежащее в основе значение, следует явно привести его к требуемому типу.

Спецификация значений для перечислимых констант

Вы не обязаны принимать значения по умолчанию для констант перечисле- ний. Можно явно присвоить значения любой или всем константам перечисления. Например:

В результате этого Асе будет иметь значение 1, Two — 2 и так далее, вплоть до King, которое примет значение 13. Если же вы хотите, чтобы значения констант ото- бражали старшинство карт, где самый старший — туз (Асе), то можете написать опре- деление перечисления так:

В этом случае Two принимает значение 2, а последующие константы — последую- щие значения в порядке возрастания, так что King опять будет равен 13. Асе получа- ет значение 14 — в соответствии с явным присваиванием.

Данные, переменные и вычисления 111

Значения, присвоенные перечислимым константам, не обязательно должны быть уникальными. Это дает возможность использовать значения констант для выражения некоторого дополнительного свойства. Например:

Здесь определено перечисление WeekDays, константы которого имеют тип bool. Лежащие в основе значения присвоены явно, символизируя отличие выходных от будней.

Резюме

В этой главе вы ознакомились с основами вычислений на С++. Вы изучили все элементарные типы данных, представленные в языке, и все операторы для непосред- ственного манипулирования этими типами. Ниже кратко передана суть того, о чем было сказано в этой главе.

  • Программа на С++ состоит как минимум из одной функции по имени main ().

  • Исполняемая часть функции состоит из операторов, заключенных в фигурные скобки.

  • Операторы в С++ завершаются точкой с запятой.

  • Именованные объекты С++, такие как переменные и функции, могут иметь имена, состоящие из последовательностей букв и цифр, начинающихся с бук- вы, причем знак подчеркивания трактуется как буква. Символы верхнего и нижнего регистра считаются различными.

  • Для именования объектов программы, таких как переменные, нельзя исполь- зовать ключевые слова С++. Полный список зарезервированных слов С++ при- веден в приложении А.

  • Все константы и переменные в С++ относятся к определенному типу. Фундамен- тальные типы ISO/ANSI С++ — char, int, long, float и double. В C++/CLI также определены типы Intl6, Int32 и Int64.

  • Имя и тип переменной определяются в операторе объявления, завершающем- ся точкой с запятой. В объявлениях может выполняться инициализация пере- менных начальными значениями.

  • Можно защищать значения переменных базовых типов с помощью модифика- тора const. Это предотвращает непосредственные модификации таких пере- менных в программе. В любом месте программы, где обнаружится попытка из- менить значение константы, выдается ошибка компиляции.

  • По умолчанию переменная является автоматической; это означает, что она су- ществует, только начиная с точки ее объявления и до конца блока, в котором она объявлена, указанного закрывающей фигурной скобкой.

  • Переменная может быть объявлена как static. В этом случае она продолжа- ет существовать в течение всего времени выполнения программы. Но доступ к ней открыт только в области видимости (блоке), где она определена.

  • Переменные могут быть объявлены вне любых блоков программы — в этом слу- чае они имеют глобальную область видимости. Переменные, имеющие глобаль- ную область видимости, доступны из любой ее точки, за исключением тех мест,

где существуют локальные переменные с теми же именами. Но даже там к ним можно обратиться, используя операцию разрешения контекста.

  • Пространство имен определяет область видимости, объявленные в которой имена квалифицированы дополнительным именем — именем пространства имен. Обращение к таким именам извне этого пространства имен требует обя- зательной квалификации (полного имени).

  • Стандартная библиотека ISO /ANSI С++ содержит функции и операторы, кото- рые вы можете применять в своих программах. Все они объявлены в простран- стве имен std. Корневое пространство имен библиотек C++/CLI называется System. Получить доступ к индивидуальным объектам в пространстве можно путем указания имени пространства имен в составе квалифицированного име- ни с применением операции разрешения контекста, либо после указания в объявлении using имени этого пространства имен.

  • lvalue — это объект, который может стоять в левой части выражения присваи- вания. Примерами lvalue могут быть неконстантные переменные.

  • Можно смешивать разнотипные переменные и константы в пределах одного выражения, но при этом они при необходимости автоматически преобразуют- ся к одному общему типу. Преобразование типа выражения, стоящего справа от знака равенства в выражениях присваивания, к типу левой части также при необходимости выполняется автоматически. Это может привести к потере ин- формации, когда тип левого элемента не может содержать информацию типа правого выражения: например double, преобразованное в int, или long, пре- образованное в short.

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

  • Ключевое слово typedef позволяет определять синонимы для других типов.

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

В этой главе вы узнали о трех стратегиях кодирования, которых можно придержи- ваться при написании программ C++/CLI.

  • Вы должны использовать имена фундаментальных типов для переменных, но иметь в виду, что на самом деле они — синонимы имен классов типа значения в программах C++/CLI. Важность этого обстоятельства станет более очевидной, когда вы узнаете больше о классах.

  • Вы должны использовать в своем коде C++/CLI saf e_cast , а не static_cast. Разница между ними более важна в контексте объектов классов, но если вы вы- работаете привычку применять saf ecast, то можно ожидать, что тем самым избежите проблем.

  • Для объявления перечислимых типов в C++/CLI вы должны использовать enum class.

Данные, переменные и вычисления 113

Упражнения

Исходные коды упражнений и их решения можно загрузить с Web-сайта издатель- ства.

  1. Напишите программу ISO/ANSI С++, которая приглашает пользователя ввести число, а затем печатает его, используя локальную целочисленную переменную.

  2. Напишите программу, которая читает целое значение, вводимое с клавиатуры, в переменную типа int и использует одну из битовых операций (но не %!) для определения положительного остатка от деления на 8. Например, 29 = (3 х 8) + 5 и -14 = (-2 х 8) + 2 имеют положительные остатки 5 и 2 соответственно.

  3. Снабдите скобками следующие выражения, чтобы проиллюстрировать приори- теты и ассоциативность:

  1. Создайте программу, которая вычисляет коэффициент пропорциональности (aspect ratio) экрана вашего компьютера по заданным значениям ширины и вы- соты в пикселях, используя следующие операторы:

Какой ответ вы получите в результате? Будет ли он удовлетворительным? Если нет — как следует модифицировать код, не добавляя новых переменных?

  1. (Усложненное.) Не запуская на выполнение следующий код, можете ли вы ска- зать, какой результат он выдаст и почему?

6. Напишите консольную программу C++/CLI, которая использует перечисле- ние для идентификации месяцев года значениями номеров месяцев от 1 до 12. Программа должна выдавать каждую константу перечисления и лежащее в осно- ве значение.

7. Напишите консольную программу C++/CLI, которая вычислит площади трех комнат до ближайшего числа полных квадратных футов. Размеры комнат:

Комната 1: 10,5 на 17,6, Комната 2: 12,7 на 18,9, Комната 3: 16,3 на 15,4

Программа также должна вычислить и вывести среднюю площадь этих трех комнат, а также их общую площадь, причем в каждом случае результат должен быть ближайшим целым числом квадратных футов.

Решения и циклы

В этой главе вы узнаете, как можно добавить в программы С++ средства принятия решений. Кроме того, вы научитесь тому, как заставить программу повторно выпол- нять набор действий до наступления определенного условия. Это позволит вам обра- батывать значительные объемы входной информации, а также выполнять проверку корректности прочтенных данных. Вы сможете писать программы, которые адапти- руют свое поведение в зависимости от входных данных, и иметь дело с проблемами, где принятие решений основано на логике. После изучения этой главы вы узнаете следующие моменты.

  • Как сравнивать значения данных.

  • Как изменять последовательность выполнения программы на основе некоторо- го результата.

  • Как применять логические операции и выражения.

  • Как справляться с ситуациями с множеством вариантов выбора.

  • Как писать и использовать циклы в программах.

Начну я с одного из наиболее мощных и фундаментальных инструментов програм- мирования: возможности сравнения переменных и выражений с другими перемен- ными и выражениями, чтобы на основе полученного результата выполнять один или другой набор операторов.

Сравнение значений

Если только вы не хотите принимать решения наобум, то вам понадобится меха- низм сравнения сущностей. Это вовлекает в дело некоторые новые операции, называ- емые операциями отношений. Поскольку вся информация в компьютере в конечном итоге представлена в числовом виде (в предыдущей главе вы видели, как в числовом виде представляется символьная информация), сравнение числовых значений — суть