246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 10
Текст из файла (страница 10)
этапеременнаяявнонеобъявляетсябеззнаковой,топодразумеваетсяееиспользованиесознаком).Востальномэтапрограммавыполняеттежедействия,чтоипредыдущая,нонаэкранвыводятсясовсем другие результаты. Чтобы до конца понять, почему получены именно такие результаты,нужнознать,какпредставляютсячисласознакомвдвухбайтовомцеломзначении.Этотпримерпоказывает,чтовслучаеприращениямаксимальногоположительногоцелогочисла со знаком будет получено не нулевое значение (как в случае с беззнаковыми целыми), аминимальноеотрицательноечисло.СимволыСимвольные переменные (типа char) обычно занимают один байт, этого достаточно дляхранения 256 значений печатаемых символов (см. приложение В). Значение типа char можноинтерпретироватькакчисловдиапазоне0—255,илисимволASCII.НаборсимволовASCIIиегоэквивалент ISO (International Standards Organization — Международная организация постандартизации)представляютсобойспособкодировкивсехбукв,цифризнаковпрепинания.Например, в коде ASCII английской строчной букве "а" присвоено значение 97.
Всемпрописнымистрочнымбуквам,всемцифрамизнакампрепинанияприсвоенызначенияот1до128. Дополнительные 128 знаков и символов зарезервированы для расширения возможностейкомпьютера,хотярасширенныйнаборсимволовIBMсталужечем-товродестандарта.Примечание:ASCIIобычнопроизноситсякак"аскей".Примечание:Компьютеры не имеют ни малейшего понятия, ни о каких буквах, знакахпрепинания или предложениях. Все они понимают только числа.
В действительности же ониоценивают некоторые электрические параметры в определенных точках своих схем. Еслизначениеоцениваемогопараметравышенекоторойоговореннойвеличины,онопредставляетсявнутренне как 1, если нет — как 0. Путем группирования нулей и единиц компьютер способенгенерироватькодовыекомбинации,которыеможноинтерпретироватькакчисла,ате,всвоюочередь,можноприсвоитьбуквамизнакампрепинания.СимволыичислаЕсли поместить какой-нибудь символ, например "а", в переменную типа char, то вдействительности она будет хранить число, лежащее в диапазоне между 0 и 255.
Однакокомпиляторзнает,какпереходитьотсимволовкихцифровымэквивалентамвASCIIиобратно.Взаимосвязьмеждучисломибуквойпроизвольна,посколькунетникакойвесомойпричиныдляприсваиваниястрочнойбукве"а"именнозначения97.Есливсесоставляющиекомпьютера(ваша клавиатура, компилятор и экран) с этим "согласны", никаких проблем не возникнет.Однаковажнопонимать,чтомеждузначением5исимволом"5"большаяразница.Символу"5"вдействительностисоответствуетзначение53,такжекакбукве"а"соответствуетчисло97.Листинг3.6.Выводназкрансимволовпоихзначениям.1:#include<iostream.h>2:intmain()3:{4:for(inti=32;i<128;i++)5:cout<<(char)i;6:return0;7:}Результат:!"#$%'()*+,./0123456789:;<>?@ABCDEFGHIJKLMNOP_QRSTUVWXYZ[\]"`abcdefghijklmnopqrstuvwxyz{|{~Этапростаяпрограммавыводитсимволы,значениякоторыхлежатвдиапазоне32—127.СпециальныесимволыКомпилятор C++ распознает некоторые специальные символы, предназначенные дляформатирования текста.
(Самые распространенные из них представлены в табл. 3.2.) Чтобывставитьэтисимволывпрограмму,используетсяобратныйслеш(называемыйсимволомначалауправляющей последовательности), указывающий, что следующий за ним символы являетсяуправляющими. Следовательно, чтобы вставить в программу символ табуляции, нужно ввестиодиночнуюкавычку,обратныйслеш,буквуtисноваодиночнуюкавычку:chartabCharacter='\t';Вэтомпримереобъявляетсяпеременнаятипаchar(сименемtabCharacter),котораятутжеинициализируется символьным значением \t, распознаваемым как символ табуляции.Специальныесимволыформатированияиспользуютсяпривыводеинформациинаэкран,вфайлилинадругоеустройствовывода(например,принтер).Символ начала управляющей последовательности изменяет значение символа, которыйследуетзаним.Например,обычносимволnозначаетбуквуя,нокогдапереднейстоитсимволначалауправляющейпоследовательности(\),тоонпревращаетсявсимволразрывастроки.Таблица3.2.Управляющиесимволы.КонстантыПодобнопеременным,константыпредставляютсобойячейкипамяти,предназначенныедляхраненияданных.Но,вотличиеотпеременных,константынеизменяются(очемговоритсамоназвание—константа).Создаваемуюконстантунужноинициализировать,посколькупозжеейнельзяприсвоитьновоезначение,ВязыкеC++предусмотренодватипаконстант:литеральныеисимвольные.ЛитеральныеконстантыЛитеральная константа — это значение, непосредственно вводимое в самой программе.Например,ввыраженииintmyAge=39;myAge является переменной типа int, а число 39 — литеральной константой.
Нельзяприсвоитьникакоезначениеконстанте39.СимвольныеконстантыСимвольнаяконстанта—этоконстанта,представленнаяименем(точнотакже,какименемпредставляется любая переменная). Однако, в отличие от переменной, значениеинициализированнойконстантыизменитьнельзя.Есливвашейпрограммеестьоднацелочисленнаяпеременнаясименемstudents,адругая—с именем classes, вы могли бы вычислить общее количество учеников школы при условии, чтовамизвестно,сколькоклассоввшколеисколькоучениковвкаждомклассе(допустим,каждыйкласссостоитиз15учеников):students=classes*15;Примечание:Символ(*)означаетумножение.В этом примере число 15 является литеральной константой.
Но если эту литеральнуюконстантузаменитьсимвольной,товашупрограммубудетлегчечитатьиизменятьвбудущем:students=classes*studentsPerClassЕсли впоследствии потребуется изменить количество учеников в каждом классе, высможете сделать это единожды в той строке программы, где определяется константаstudentsPerClass, и вам не придется вносить изменения во все строки программы, гдеиспользуетсяэтозначение.В языке C++ существует два способа объявления символьной константы. Традиционный инынеужеустаревшийспособсостоитвиспользованиидирективыпрепроцессора#define.Определениеконстантспомощьюдирективы#deiineДляопределенияконстантытрадиционнымспособомвведитеследующеевыражение:#definestudentsPerClass15Обратите внимание на то, что константа studentsPerClass не имеет никакого конкретноготипа(int,charит.д.).Директива#defineвыполняетпростуютекстовуюподстановку.Каждыйраз,когдапрепроцессорвстречаетсловоstudentsPerClass,онзаменяетеголитералом15.Поскольку препроцессор запускается перед компилятором, последний никогда не увидитконстанту,абудетвидетьтолькочисло15.ОпределениеконстантспомощьюключевогословаconstХотя директива #define и справляется со своими обязанностями, в языке C++ существуетновый,болееудобныйспособопределенияконстант:constunsignedshortintstudentsPerClass=15;ВэтомпримеретакжеобъявляетсясимволическаяконстантасименемstudentsPerClass,нона сей раз для этой константы задается тип unsigned short int.
Этот способ имеет несколькопреимуществ, облегчая дальнейшую поддержку вашей программы и предотвращая появлениенекоторых ошибок. Самое важное отличие этой константы от предыдущей (объявленной спомощьюдирективы#define)состоитвтом,чтоонаимееттипикомпиляторможетпроследитьзаееиспользованиемтолькопоназначению(т.е.всоответствиисобъявленнымтипом).Примечание:Вовремяработыпрограммыконстантыизменятьнельзя.Еслижевозникланеобходимость в изменении, например, константы studentsPerClass, вам нужно изменитьсоответствующееобъявлениевпрограммеиперекомпилироватьее.Рекомендуется:Следите,чтобызначенияпеременныхнепревышалидопустимыйпредел.Присваивайте переменным осмысленные имена, отражающие их назначение.
Используйтетипыshortиlong,чтобыболееэффективноуправлятьпамятьюкомпьютера.Нерекомендуется:Неиспользуйтевкачествеименпеременныхключевыеслова.КонстантыперечисленийПеречисления позволяют создавать новые типы данных, а затем определять переменныеэтих типов, значения которых ограничены набором константных значений.
Например, можнообъявить C0L0R как перечисление и определить для него пять значений: RED, BLUE, GREEN,WHITEИBLACK.Для создания перечисления используется ключевое слово enum, за которым следуют: имятипа, открывающая фигурная скобка, список константных значений, разделенных запятыми,закрывающаяфигурнаяскобкаиточкасзапятой.Например:enumCOLOR{RED,BLUE,GREEN,WHITE,BLACK};Этовыражениевыполняетдвезадачи.1.СоздаетсяперечислениесименемC0L0R,являющеесяновымтипом.2.
Определяются символьные константы: RED со значением 0; BLUE со значением 1;GREENсозначением2ит.д.Каждой константе перечисления соответствует определенное целочисленное значение. Поумолчаниюперваяконстантаинициализируетсязначением0,акаждаяследующая—значением,на единицу большим предыдущего. Однако любую константу можно инициализироватьпроизвольным значением, и в этом случае явно неинициализированные константы продолжатвозрастающуюпоследовательность,взявзаточкуотсчетазначение,стоящеепередними.Такимобразом,еслизаписатьenumColor{RED=100,BLUE,GREEN=500,WHITE,BLACK=700};токонстантаredбудетиметьзначение100;константаblue—101;константаGREEN—500;константаWHITE—501;константаBLACK—700.Теперь можно определить переменные типа C0L0R, но каждой из них можно присвоитьтолько одно из перечислимых значений (в данном случае RED, BLUE, GREEN, WHITE илиBLACKлибо100,101,500,501или700).ПеременнойC0L0Rможноприсвоитьлюбоезначениецвета.Насамомделеэтойпеременнойможноприсвоитьлюбоецелоезначение,дажееслиононе соответствует ни одному из разрешенных цветов, но в этом случае приличный компилятордолженвозмутитьсяипоказатьпредупреждающеесообщение.Важнопонимать,чтопеременныеперечисления на самом деле имеют тип unsigned int и целочисленным переменнымприсваиваютсязаданныеконстантыперечисления.Однакоиногдаприработесцветами,дняминедели или другими подобными наборами значений неплохо иметь возможность называть этизначения по имени.
В листинге 3.7 представлена программа, в которой используется типперечисления.Листинг3.7.Использованиеперечисления1:#include<iostream.h>2:intmain()3:{4:enumDays{Sunday,Monday,Tuesday,5:Wednesday,Thursday,Friday,Saturday};6:intchoice;7:cout<<"Enteraday(0-6):";8:cin<<choice;9:if(choice=Sunday||choice==Saturday)10:cout<<"\nYou'realreadyoffonweekends!\n";11:else12:cout<<"\nOkay,I'llputinthevacationday.\n";13:return0;14:}Результат:Enteraday(0-6):6You'realreadyoffonweekends!Анализ:Встроке4определяетсяперечислениеDAYSссемьюконстантнымизначениями.Все они образуют возрастающую последовательность чисел, начиная с нуля; таким образом,значениевторника(Tuesday)равно2.Пользователюпредлагаетсяввестизначениемежду0и6.ОннеможетввестисловоSunday,посколькувпрограмменепредусмотренпереводсимволоввзначениеперечисления.Номожнопроверить введенное пользователем значение, сравнив его с константными значениямиперечисления, как показано в строке 9.