246071-Либерти-Освой-самостоятельно-С-за-21-день (852741), страница 12
Текст из файла (страница 12)
Символыпробеловможноиспользоватьдляулучшениячитабельностипрограммы,чтооблегчитработусней.Нопринеумеломиспользованииэтижепробелымогутсовершеннозапутатьпрограммныйкод.СоздателиC++предоставилимногоразличныхвозможностей,аужнасколькоэффективноонибудутиспользоваться,зависитотвас.Символы пробелов не отображаются на экране и при печати — видны только различныеотступыипромежуткимеждуэлементамитекста.Блокиикомплексныеваражения Иногда для облегчения восприятия программы логически взаимосвязанные выраженияудобнообъединятьвкомплексы,называемыеблоками.Блокначинаетсяоткрывающейфигурнойскобкой({)иоканчиваетсязакрывающейфигурнойскобкой(}).Хотякаждоевыражениевблокедолжно оканчиваться точкой с запятой, после символов открытия и закрытия блока точки сзапятойнеставятся,каквследующемпримере:{temp=а;а=b;b=temp;}Этот блок выполняется как одно выражение, осуществляющее обмен значениями междупеременнымиаиb.Рекомендуется:Незабывайте о закрывающейфигурной скобке каждый раз, когдаиспользуется открывающая фигурная скобка.
Завершайте выражения в программе символомточкисзапятойНе рекомендуется:Используйте разумно символы пробелов, чтобы сделать своюпрограммуболеепонятной,аненаоборот.ОперацииВсе, в результате чего появляется некоторое значение, в языке C++ называется операцией.Обоперацияхговорят,чтоонивозвращаютзначение.Так,операция3+2;возвращаетзначение5.Всеоперацииявляютсявместестемивыражениями.Возможно,выбудетеудивленытому,чтомногиепрограммныеблокирассматриваютсякаквыражения.Приведемлишьтрипримера:3.2//возвращаетзначение3.2PI//вещественнаяконстанта,котораявозвращаетзначение3.14SecondsPerMinute//целочисленнаяконстанта,котораявозвращает60Предполагая,чтоPI—константа,равная3.14,аSecondsPerMinute—константа,равная60,можноутверждать,чтовсетривыраженияявляютсяоперациями.Выражениеx=а+b;нетолькоскладываетзначенияпеременныхаиb,ноиприсваиваетрезультатпеременнойx,т.е.
возвращает результат суммирования переменной x. Поэтому данное выражение вполнеможноназватьоперацией.Операциивсегдарасполагаютсясправаотоператораприсваивания:у=x=а+b;Данное выражение выполняет представленную ниже последовательность действий.Прибавляемакb.Присваиваемрезультатвыраженияа+bпеременнойx.Присваиваемрезультатвыраженияприсваиванияx=а+bпеременнойу.Еслипеременныеа,b,xиуявляютсяцелымииеслиаимеетзначение2,аb—значение5,топеременнымxиубудетприсвоенозначение7.Примервыполнениянекоторыхвыраженийпредставленвлистинге4.1.Листинг4.1.Выполнениесложныхопераций1:#include<iostream.h>2:intmain()3:{4:inta=0,b=0,x=0,y=35;5:cout<<"a:"<<a<<"b:"<<b;6:cout<<"x:"<<x<<"y:"<<y<<endl;7:a=9;8:b=7;9:y=x=a+b;10:cout<<"a:"<<a<<"b:"<<b;11:cout<<"x:"<<x<<"y:"<<y<<endl;12:return0;13:}Результат:а:0b:0x:0у:35а:9b:7x:16у:16Встроке4объявляютсяиинициализируютсячетырепеременные.Ихзначениявыводятсявстроках 5 и 6.
В строке 7 переменной а присваивается значение 9. В строке 8 переменной bприсваивается значение 7. В строке 9 значения переменных а и b суммируются, а результатприсваивается переменной x. Результат операции x = a+b, в свою очередь, присваиваетсяпеременнойу.ОператорыОператор — это литерал, который заставляет компилятор выполнять некоторое действие.Операторывоздействуютнаоперанды.ОперандамивC++могутбытькакотдельныелитералы,такицелыевыражения.ЯзыкC++располагаетдвумявидамиоператоров:•операторыприсваивания;•математическиеоператоры.ОператорприсваиванияОператорприсваивания(=)позволяетзаменитьзначениеоперанда,расположенногослевойстороныотзнакаравенства,значением,вычисляемымсправойстороныотнего.Так,выражениеx=а+b;присваивает операнду x значение, которое является результатом сложения значенийпеременныхаиb.Операнд, который может находиться слева от оператора присваивания, называетсяадреснымоперандом,илиl-значением(отангл.словаleft,т.е.левый).Операнд,которыйможетнаходиться справа от оператора присваивания, называется операционным операндом, или r-значением(отангл.словаright,т.е.правый).Константы могут быть только r-значениями и никогда не бывают адресными операндами,поскольку в ходе выполнения программы значения констант изменять нельзя.
Так, можнозаписать:x=35;//правильноНонельзязаписать:35=x;//ошибка!Повторим: l-значение — это операнд, который может стоять в левой части выраженияприсваивания,аг-значение—операнд,которыйможетстоятьвправойчастиэтоговыражения.Обратите внимание, что все l-значения могут быть r-значениями, но не все r-значения могутбыть l-значениями. Примером г-значения, которое не может быть l-значением, служитлитеральнаяконстанта.Так,можнозагасать:x=5;,нонельзязаписать:5=x;(xможетбытьlилиr-значением,а5можетбытьтолькоr-значением).МатематическиеоператорыВ C++ используется пять математических операторов: сложения (+), вычитания (-),умножения(*),целочисленногоделения(/)иделенияпомодулю(%).В операциях сложения и вычитания разобраться несложно: они возвращают сумму иразность двух операндов.
Хотя следует отметить, что вычитание беззнаковых целых можетпривести к удивительным результатам, если полученная разность окажется отрицательнымчислом. Вы уже видели нечто подобное на прошлом занятии при описании переполненияпеременных. В листинге 4.2 демонстрируется ситуация, когда из малого беззнакового числавычитаетсябольшоебеззнаковоечисло.Листинг4.2.Примервычитанияспереполнениемцелогочисла1://Листинг4.2.Примервычитанияс2://переполнениемцелогочисла3:#include<iostream.h>4:5:intmain()6:{7:unsignedintdifference;8:unsignedintbigNumber=100;9:unsignedintsmallNumber=50;10:difference=bigNumber-smallNumber;11:cout<<"Differenceis:"<<difference;12:difference=smallNumber-bigNumber;13:cout<<"\nNowdifferenceis:"<<difference<<endl;14:return0;15:}Результат:Differenceis:50Nowdifferenceis:4294967246Анализ: Оператор вычитания используется в строке 10, а результат выводится на экран встроке 11, в данном случае вполне ожидаемый.
В строке 12 вновь вызывается операторвычитания,нонаэтотразбольшоебеззнаковоечисловычитаетсяизмалогобеззнаковогочисла.Результат должен быть отрицательным, но поскольку он вычисляется (и выводится) какбеззнаковоечисло,происходитпереполнение,очемговорилосьнапрошломзанятии.ЭтатемаподробнорассматриваетсявприложенииА.ЦелочисленноеделениеиделениепомодулюЦелочисленноеделениенесколькоотличаетсяотобычного.Целочисленноеделение—этотожеcaмoeделение,котороевыизучали,когдаходиливпервыйкласс.Приделениичисла21начисло4(21/4)вслучаецелочисленногоделениявответеполучается5иостаток1.Чтобы получить остаток, нужно число 21 разделить по модулю 4 (21 % 4), в результатеполучимостаток1.Операция деления по модулю иногда оказывается весьма полезной, например, если вызахотите вывести из ряда чисел каждое десятое значение.
Любое число, результат делениякоторогопомодулю10равеннулю,являетсякратнымдесяти,т.е.делитсяна10безостатка.Так,результат выражения 1 % 10 равен 1; 2 % 10 равен 2 и т.д.; а 10 % 10 равен 0. Результат отделения11%10сноваравен1;12%10сноваравен2;итакможнопродолжатьдоследующегочисла, кратного 10, которым окажется 20. Мы воспользуемся этим методом при рассмотрениицикловназанятии7.ВопросыиответыПриделении5на3яполучаювответе1.Вчеммояошибка?Приделенииодногоцелогочисланадругоевкачестверезультатавытакжеполучитецелоечисло.Следовательно,5/3равно1.Для получения дробного результата нужно использовать вещественные числа. Выражение5,0/3,0дастдробныйответ:1,66667.Если ваш метод принимает в качестве параметров целочисленные значения, нужнопривестиихктипуfloat.Вопросы и ответы: Выполняя операцию приведения типа переменной, вы заставляетекомпиляторизменитьеетип.Приэтомвыкакбудтоговоритесвоемукомпилятору:"Язнаю,чтоделаю".
Было бы неплохо, если бы это оказалось правдой, поскольку компилятор как быотвечает вам: "Как скажете, босс: вся ответственность ложится на вас". В данном случае мыхотимсказатькомпилятору:"Японимаю,чтотысчитаешьэтозначениецелым,ноязнаю,чтоделаю: это действительно вещественное значение".
Для приведения типа существует дваспособа. Можно использовать приведение типа в старом стиле С или новый улучшенныйоператорANSIstatic_cast.Обавариантадемонстрируютсявлистинге4.3.Листинг4.3.Приведениепеременнойктипуfloat1:#include<iostream.h>2:3:voidintDiv(intx,inty)4:{5:intz=x/y;6:cout<<"z:"<<z<<endl;7:}8:9:voidfloatDiv(intx,inty)10:{11:floata=(float)x;//старыйстиль12:floatb=static_cast<float>(y);//современныйстиль13:floatc=a/b;14:15:cout<<"c:"<<c<<endl;16:}17:18:intmain()19:{20:intx=5,y=3;21:intDiv(x,y);22:floatDiv(x,y);23:return0;24:}Результат:z:1с:1.66667Анализ: В строке 20 объявляются две целочисленные переменные. В строке 21 они какпараметры передаются функции intDiv, а в строке 22 — функции floatDiv. Вторая функцияначинаетсясостроки9.Встроках11и12целыезначенияприводятсяквещественномутипуиприсваиваются переменным типа float.
Результат деления присваивается третьей переменнойтипаfloatвстроке13ивыводитсянаэкранвстроке15.СовместноеиспользованиематематическихоператоровсоператорамиприсваиванияНетничегонеобычноговтом,чтобыкпеременнойприбавитьнекотороезначение,азатемприсвоить результат той же переменной. Если у вас есть переменная myAge и вы хотитеувеличитьеезначениенадва,можнозаписатьследующее:intmyAge=5;inttemp;temp=myAge+2;//складываем5+2ирезультатпомещаемвtempmyAge=temp;//значениевозрастасновапомещаемвmyAgeОднако этот метод грешит излишествами.