bmstu_iu6_Cpp1 (823967), страница 4
Текст из файла (страница 4)
Этот описатель отключает оптимизацию компилятора для указанной переменной, и чаще всего применяется при реализации программ с параллельным выполнением;<Тип> – описатель типа данных: int, char, float, double и т.д., если описательтипа отсутствует, то по умолчанию берется int;<Имя> – идентификатор переменной или константы;<Значение> – начальное значение переменной или значение константы.Примеры:// объявление неинициализированных переменныхint f,c,d;// три переменных для хранения целых чиселfloat r;// одна переменная для хранения вещественного числаI,j;// две переменные типа int (по умолчанию)unsigned int max,min; // две беззнаковые целочисленные переменныесhar c1,c2;// две символьные переменныеunsigned char c5;// переменная для хранения беззнакового кода символа// объявление инициализированных переменныхdouble k=89.34; float eps=0.1e-4; char ch=’G’;// поименованные константыconst long a=6;const float pp=6.6e-34;Переменные и поименованные константы могут быть объявлены в любом месте программы: вне всех функций, внутри функций, в любом месте функции, а в С++ – даже внутри управляющих операторов, например:for(s=0,int i=1;i<n;i++)s+=i;//переменная i объявлена внутри оператораОглавление16Переменные, объявленные внутри оператора, существуют только во время его выполнения.
Использование таких переменных часто приводят к ошибкам, а потому – не рекомендуется.Основное условие размещения объявлений: объявление должно стоять до первогообращения к переменной или константе. Однако технология создания надежных программрекомендует все необходимые объявления делать в начале соответствующей функции.Кроме того, в объявлении может присутствовать описатель класса памяти, определяющий видимость переменной в подпрограммах и время хранения ее значения, например:static, extern и т. д. (см. раздел 4.1.1).1.3.4 * Перечисляемый типПеречисляемый тип появился еще в Си, он позволяет определить собственный наборпоименованных целочисленных значений для объявляемой переменной.
Тип описываетсяследующим образом:enum [<Имя типа>]{<Имя>[=<Целое>][,<Имя>[=<Целое>]…]} <Список именпеременных>;где<Имя типа> – идентификатор перечисляемого типа, обязательно указывается, еслиобъявление переменных предполагается выполнять в отдельной конструкции;<Имя> – идентификатор целочисленного значения;<Целое> – присваиваемое целое значение, может быть опущено, если значение, сопоставляемое идентификатору, при описании типа не указано, то берется предыдущее значение и к нему добавляется единица, для первого значения по умолчанию берется 0, например:enum days (sun, mon, tue, fri=5, sat) day; // конструкции описывает// тип days и объявляет переменную day, которая может принимать// значения: sun=0, mon=1, tue=2, fri=5, set=6С переменными перечисляемого типа можно выполнять необходимые операции,например: Day=fri; .1.3.5 * Объявление нового типа данныхВ С++ появилась конструкция, позволяющая определять новые типы переменных:typedef <Описание типа> <Имя объявляемого типа>;Например:Оглавление17typedef unsigned int word; // переименовываем подтип беззнаковый целый// в wordtypedef enum {FALSE, TRUE} boolean; // объявляем новый тип boolean// и разрешаем переменным этого типа// принимать значения FALSE(0) и TRUE(1)В программе можно объявлять переменные указанных типов, например:word l,m;boolean flag;1.4 ОперацииПрограммирование вычислений предполагает, что над данными программы выполняются некоторые преобразования.
Для этого в Си и С++ определены операции соответствующих типов: арифметические, логические, отношений, логические поразрядные, порядковые, сдвига, условная и присваивания. Типы данных, над которыми можно выполнять перечисленные операции, указаны в таблице 1.3.Таблица 1.3 – Область действия операций С++Тип операцийАрифметическиеЛогическиеОтношенийЛогические поразрядныеПорядковыеСдвигиУсловнаяПрисваиванияТипы данныхИнтегральныеСимвольныйЛогический+––+++––++––++++Целые++++++++Адресный+–+–+–++Арифметические операции. Арифметические операции делятся на:•унарные «+» и «-», например: -beta, унарный плюс введен для симметрии сунарным минусом;•бинарные: сложение «+», вычитание «-», умножение «*», деление «/», получение остатка целочисленного деления «%».При делении двух целых чисел и при определении остатка от деления целых чиселоперация выполняется с точностью до целых (!), т.е.
5/2 = 2, 5%2=1.Неявное преобразование типов. Если бинарная операция выполняется над операндами различных типов, то перед операцией оба операнда преобразуются в тип c большейразрядной сеткой по следующим схемам:Оглавление18char⇒ short⇒ int ⇒ longfloat ⇒ double ⇒ long doubleЦелые числа при этом преобразуются в вещественные.Например:int a=5, b = 3; float c=9.3…a+b// результат 8, тип inta/b// результат 1, тип inta%b// результат 2, тип inta*b// результат 15, тип intc/b// результат 3.1, тип float(a+b)/(a-b*a) // результат 0, тип intДля выполнения операций над некоторыми типами данных требуется явное преобразование типов.
Такое преобразование может быть выполнено двумя способами: с использованием функции типа и применением канонической формы.Функциональное преобразование записывается следующим образом:<Имя типа> (<Выражение>)Например:int(3.14)=3// будет отброшена дробная часть числаfloat(2/3)=0.0// сначала будет выполнено целочисленное делениеint(’A’)=65// код символаОднако функциональная запись не подходит для подтипов, когда имя типа состоит изнескольких описателей. В этом случае применяется каноническая форма преобразования:(Имя типа)<Выражение>Например:(unsigned long)(x/3+2);(long)25;(unsigned char)123;Если определить новый тип – тогда можно использовать и функциональное преобразование, например:typedef unsigned long int uli;uli(x/3-123);Логические операции.
К логическим операциям относятся:! – логическое «не» – отрицание целочисленного операнда – унарная логическаяоперация, выполняется над целым числом, которое интерпретируются в логическое значе-Оглавление19ние по правилу Си (0 – false, не 0 – true), результат – целочисленный 0 или не 0, интерпретируемые по тем же правилам;&& – логическое «и» – конъюнкция целочисленных операндов, результат операции<Операнд1>&&<Операнд2> = «Истина» только тогда, когда оба операнда «Истина»;|| – логическое «или» – дизъюнкция целочисленных операндов, результат операции<Операнд1>||<Операнд2> = «Истина», если хотя бы один операнд «Истина».Чаще всего операндами логических операций являются результаты операций отношения.
Например:6>2&&3==3// результат «Истина»!(6>2&&3==3)// результат «Ложь»x!=0 && 20/x<5// второе выражение вычисляется, если х!=0, иначе результат// всегда «Ложь»Операции отношения. Операции меньше «<», больше «>», равно «==», неравно«!=», меньше или равно «<=», больше или равно «>=» применяют к числам и символам,точнее кодам этих символов, в результате получают логическое значение «Истина» или«Ложь».Например:int a = 5;int b = 3;…a > b // результат «Истина»a == b // результат «ложь»Логические поразрядные операции. В С++ реализованы следующие логическиепоразрядные операции:~ – поразрядная инверсия битов («не») в битовых представлениях целых чисел,& – поразрядная конъюнкция («и») битов в битовых представлениях целых чисел,| – поразрядная дизъюнкция («или») битов в битовых представлениях целых чисел,^ – поразрядное исключающее «или» битов в битовых представлениях целых чисел.Например:6&5 // результат 4: 00000110 & 00000101 000001006|5 // результат 7: 00000110 |00000101 000001116^5 // результат 3: 00000110 ^ 00000101 00000011Порядковые операции.
Существуют всего две порядковые операции, каждая из которых имеет две модификации:++<Идентификатор>, <Идентификатор>++(следующее);- -<Идентификатор>, <Идентификатор> - - (предыдущее).Оглавление20Местоположение знаков операций (до или после операнда) определяет, в какой момент осуществляется изменение операнда. Если знак стоит слева от операнда – то сначалазначение изменяется, а потом принимает участие в вычислении. Если знак стоит справа отоперанда – то сначала операнд принимает участие в вычислении, а затем меняется егозначение.Например:а) i++;б) a=5;i=3;c=a*++i; // результат операции с = 20, i=4Сдвиги.
В С++ используются две операции сдвига:>> – сдвиг вправо битового представления целого числа на количество разрядов, задаваемое правым целочисленным операндом,<< – сдвиг влево битового представления целого числа на количество разрядов, задаваемое левым целочисленным операндом.Например:4<<2// результат 16:00000100 << 000100005>>1// результат00000101 >> 000000102:Операции присваивания. В С++ присваивание относится к операциям.
При этомпомимо простого присваивания «=», при котором в переменную левого операнда копируется результат выражения правой части, определены также операции присваивания «с накоплением»: «+=», «-=», «*=», «/=», «%=», «&=», «^=», «|=», «<<=», «>>=». Эти операции присваивают левому операнду результат выполнения заданной операции, выполненной над левым и правым операндами.Например:int k;k=8;// операция простого присваиванияk*=3;// результат24k+=7;// результат31Условная операция позволяет организовать выбор одного из двух выражений в зависимости от результата заданного логического выражения, т.е.
реализовать простейшийвариант ветвления. Это единственная операция в С++, которая выполняется над тремя операндами, т.е. является триарной. Операция имеет следующий формат записи:<Выражение 1>?<Выражение 2>:<Выражение 3>При выполнении первым вычисляется значение выражения 1. Если оно истинно, т.е.результат не равен 0, то вычисляется выражение 2, которое и становится результатом. ЕслиОглавление21при вычислении выражения 1 получается 0, то вычисляется выражение 3, которое становится результатом.Например:x<0?–x:x;printf(”%3d%c%”,a,i==n?’ ’:’\n’);1.5 ВыраженияОбычно последовательно выполняемые операции в программе компонуются в выражения.
Различают простые и сложные выражения.Простые выражения представляют собой строковую запись формул, которая можетвключать литералы, поименованные константы, переменные, обращения к стандартнымфункциям и знаки операций, такие как «+», «-» и т.д.Порядок выполнения операций в выражении определяется приоритетами операций иих ассоциативностью (для последовательно записанных одинаковых операций).