- •6 Глава 1
- •12 Глава 1
- •14 Глава 1
- •16 Глава 1
- •18 Глава 1
- •20 Глава 1
- •22 Глава 1
- •24 Глава 1
- •26 Глава 1
- •31 Глава 1
- •34 Глава 2
- •36 Глава 2
- •Puc. 2.4. Дополнительные опции консольного приложения Win32
- •38 Глава 2
- •40 Глава 2
- •42 Глава 2
- •44 Глава 2
- •48 Глава 2
- •50 Глава 2
- •52 Глава 2
- •54 Глава 2
- •56 Глава 2
- •58 Глава 2
- •60 Глава 2
- •62 Глава 2
- •64 Глава 2
- •66 Глава 2
- •68 Глава 2
- •70 Глава 2
- •74 Глава 2
- •76 Глава 2
- •79 Глава 2
- •82 Глава 2
- •84 Глава 2
- •86 Глава 2
- •88 Глава 2
- •92 Глава 2
- •94 Глава 2
- •96 Глава 2
- •98 Глава 2
- •103 Глава 2
- •105 Глава 2
- •107 Глава 2
- •110 Глава 2
- •115 Глава 3
- •119 Глава 3
- •121 Глава 3
- •123 Глава 3
- •125 Глава 3
- •129 Глава 3
- •131 Глава 3
- •133 Глава 3
- •139 Глава 3
- •141 Глава 3
- •143 Глава 3
- •145 Глава 3
- •148 Глава 3
- •150 Глава 3
- •155 Глава 3
- •165 Глава 4
- •168 Глава 4
- •170 Глава 4
- •173 Глава 4
- •175 Глава 4
- •178 Глава 4
- •184 Глава 4
- •186 Глава 4
- •188 Глава 4
- •190 Глава 4
- •192 Глава 4
- •194 Глава 4
- •198 Глава 4
- •201 Глава 5
- •203 Глава 5
- •205 Глава 5
- •207 Глава 5
- •213 Глава 5
- •217 Глава 5
- •219 Глава 5
- •221 Глава 5
- •223 Глава 5
- •225 Глава 5
- •227 Глава 5
- •232 Глава 5
- •234 Глава 5
- •236 Глава 5
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 — в соответствии с явным присваиванием.
Данные,
переменные и вычисления
Значения, присвоенные перечислимым константам, не обязательно должны быть уникальными. Это дает возможность использовать значения констант для выражения некоторого дополнительного свойства. Например:
Здесь определено перечисление 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.
Данные,
переменные
и
вычисления
Упражнения
Исходные коды упражнений и их решения можно загрузить с Web-сайта издатель- ства.
-
Напишите программу ISO/ANSI С++, которая приглашает пользователя ввести число, а затем печатает его, используя локальную целочисленную переменную.
-
Напишите программу, которая читает целое значение, вводимое с клавиатуры, в переменную типа int и использует одну из битовых операций (но не %!) для определения положительного остатка от деления на 8. Например, 29 = (3 х 8) + 5 и -14 = (-2 х 8) + 2 имеют положительные остатки 5 и 2 соответственно.
-
Снабдите скобками следующие выражения, чтобы проиллюстрировать приори- теты и ассоциативность:
-
Создайте программу, которая вычисляет коэффициент пропорциональности (aspect ratio) экрана вашего компьютера по заданным значениям ширины и вы- соты в пикселях, используя следующие операторы:
-
Какой ответ вы получите в результате? Будет ли он удовлетворительным? Если нет — как следует модифицировать код, не добавляя новых переменных?
-
(Усложненное.) Не запуская на выполнение следующий код, можете ли вы ска- зать, какой результат он выдаст и почему?
6. Напишите консольную программу C++/CLI, которая использует перечисле- ние для идентификации месяцев года значениями номеров месяцев от 1 до 12. Программа должна выдавать каждую константу перечисления и лежащее в осно- ве значение.
7. Напишите консольную программу C++/CLI, которая вычислит площади трех комнат до ближайшего числа полных квадратных футов. Размеры комнат:
Комната 1: 10,5 на 17,6, Комната 2: 12,7 на 18,9, Комната 3: 16,3 на 15,4
Программа также должна вычислить и вывести среднюю площадь этих трех комнат, а также их общую площадь, причем в каждом случае результат должен быть ближайшим целым числом квадратных футов.
Решения и циклы
В этой главе вы узнаете, как можно добавить в программы С++ средства принятия решений. Кроме того, вы научитесь тому, как заставить программу повторно выпол- нять набор действий до наступления определенного условия. Это позволит вам обра- батывать значительные объемы входной информации, а также выполнять проверку корректности прочтенных данных. Вы сможете писать программы, которые адапти- руют свое поведение в зависимости от входных данных, и иметь дело с проблемами, где принятие решений основано на логике. После изучения этой главы вы узнаете следующие моменты.
-
Как сравнивать значения данных.
-
Как изменять последовательность выполнения программы на основе некоторо- го результата.
-
Как применять логические операции и выражения.
-
Как справляться с ситуациями с множеством вариантов выбора.
-
Как писать и использовать циклы в программах.
Начну я с одного из наиболее мощных и фундаментальных инструментов програм- мирования: возможности сравнения переменных и выражений с другими перемен- ными и выражениями, чтобы на основе полученного результата выполнять один или другой набор операторов.
Сравнение значений
Если только вы не хотите принимать решения наобум, то вам понадобится меха- низм сравнения сущностей. Это вовлекает в дело некоторые новые операции, называ- емые операциями отношений. Поскольку вся информация в компьютере в конечном итоге представлена в числовом виде (в предыдущей главе вы видели, как в числовом виде представляется символьная информация), сравнение числовых значений — суть