Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование. Лекция 2

.docx
Скачиваний:
11
Добавлен:
21.03.2015
Размер:
39.06 Кб
Скачать

Программирование. Лекция 2. Типы, операторы и выражения. Управление

Освещаемые вопросы: переменные и константы, типы данных С++, операторы, приоритеты и порядок вычисления операторов, конструкции управления в С++ (ветвление, циклы, переключатель switch)

Переменные и константы являются основными объектами, которые используются в программах. Для того чтобы использовать переменную, ее необходимо объявить, указав при этом ее тип (и, возможно, начальное значение). Например, вот объявление двух переменных целого типа с именами а и b (а проинициализирована значением 10):

int a = 10, b;

Операции определяют действия, которые выполняются над переменными. Выражения комбинируют переменные, константы и операторы для получения новых значений. Тип объекта определяет множество значений, которые этот объект может принимать, и операций, которые над ними могут выполняться.

Имена переменных.

Имена составляются из букв и цифр, первым символом должна быть буква или символ подчеркивания _ (существует много библиотечных функций, которые начинаются с _, поэтому не рекомендуется начинать имена переменных с символа подчеркивания). Си – регистрозависимый язык, поэтому имена example и Example будут восприняты компилятором как два разных имени. Ключевые слова (такие, как if, while, float) зарезервированы и не могут быть использованы в качестве имен.

Разумно давать переменным осмысленные имена в соответствии с их назначением, причем такие, чтобы их было нелегко спутать друг с другом. Счетчикам циклов обычно дают имена, состоящие из одной буквы.

Типы данных.

В Си существует несколько базовых типов:

  1. char – единичный байт, который может содержать один символ из допустимого символьного набора;

  2. int – целое, обычно отображающее естественное представление целых в машине. Количество байт, отведенных под int, зависит от архитектуры процессора – используется размер, с которым процессору легче работать, а также от используемого компилятора.

  3. float – число с плавающей точкой одинарной точности.

  4. double – число с плавающей точкой двойной точности.

  5. bool – логический. Величины логического типа могут принимать только значения true и false. 0 интерпретируется как false, любое другое значение как true.

  6. wchar_t (появился в C++) – расширенный символьный. Предназначен для работы с набором символов, для кодировки которого недостаточно одного байта, например, Unicode. Размер этого типа зависит от реализации и, как правило, соответствует типу short.

  7. void. Множество значений этого типа пусто. Он используется для определения возвращаемого значения функции, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.

Помимо этого, имеется несколько квалификаторов. Квалификаторы short и long применяются к целым:

short int st; // можно писать просто short st;

long int lt; // или long st;

Чаще всего для представления short int отводится 2 байта, для long int – 4 байта, для int без квалификатора – или 2, или 4 байта.

Квалификатор long также применяется к типу double. Под величину типа long double отводится 10 байт, он предназначен для арифметики с плавающей точкой повышенной точности.

Именованные константы для всех размеров вместе с другими характеристиками машины и компилятора содержатся в стандартных заголовочных файлах <limits.h> и <float.h>.

Квалификаторы signed (знаковый) и unsigned (беззнаковый) можно применять к типу char и любому целочисленному типу. Так, если значению char отводится 1 байт, то unsigned char имеет значения в диапазоне от 0 до 255, а signed char – от -128 до 127. По умолчанию все целочисленные типы считаются знаковыми, то есть квалификатор signed можно опускать.

Константы

Целая константа, например, 1234, имеет тип int. Константа типа long завершается буквой l или L, например, 123456789L. Беззнаковые константы заканчивают буквой u или U, а окончание ul или UL обозначает unsigned long.

Если константа начинается с нуля, то мы имеем дело с ее восьмеричным представлением (056), если с 0x или 0Х – константа представлена в шестнадцатеричном виде.

Символьная константа есть целое, записанное в виде символа, обрамленного одиночными кавычками, например, 'u'. Значением символьной константы является численный код символа из набора символов на данной машине (например, '0' в кодировке ASCII представлен числом 48 и не имеет отношения к численному значению 0).

Некоторые символы в символьных и строковых константах записываются с помощью Esc-последовательностей, например, \n – символ перевода строки, \t – символ табуляции, \\ - символ обратной косой черты. Произвольный восьмеричный код можно задать в виде \ooo (трех восьмеричных цифр), а шестнадцатеричный – в виде \0xhh.

Символьная константа '\0' – это символ с нулевым значением, так называемый символ null.

Строковая константа – это нуль или более символов, заключенных в двойные кавычки, например, "Это строковая константа".

Объявления

Все переменные должны быть объявлены раньше, чем будут использоваться. Объявление специфицирует (указывает) тип и содержит список из одной или нескольких переменных этого типа, например:

int a, b, c;

char ch;

В своем объявлении переменная может быть инициализирована (получить начальное значение), например:

int a, b = 3, c;

char ch = '\0';

К любой переменной в объявлении может быть применен квалификатор const для указания того, что ее значение далее не будет изменяться.

const double pi = 3.1415926;

Операторы

  1. Арифметические операторы.

К ним относятся +, -, *, / и оператор деления по модулю % (x % y дает остаток от деления х на y, если x делится на y нацело, результатом будет нуль).

Бинарные операторы + и – имеют одинаковый приоритет, который меньше приоритета *, / и %, который, в свою очередь, ниже приоритета унарных операторов + и -. Арифметические операции одного приоритета выполняются слева направо.

  1. Операторы отношения и логические операторы.

Операторами отношения являются >, >=, <, <=. Все они имеют одинаковый приоритет. Сразу за ними идет приоритет операторов сравнения == и !=. Операторы отношения имеют более низкий приоритет, чем арифметические операторы.

Логические операторы – это && (AND) и || (OR). При их использовании нужно иметь в виду одну интересную особенность. Их операнды вычисляются слева направо, и вычисления прекращаются, когда становится известной истинность или ложность результата (то есть если x = 1, y = 0, то при вычислении x||y значение y не будет участвовать в вычислении результата).

Приоритет && выше, чем у ||, но их приоритеты ниже, чем приоритет операторов отношения и равенства.

Унарный оператор ! преобразует ненулевой операнд в 0, а нуль в 1.

Операторы инкремента и декремента

Оператор инкремента ++ добавляет 1 к своему операнду, а оператор декремента – вычитает 1. Данные операторы имеют две формы: префиксную (++n) и постфиксную (n++). В первом случае значение переменной сначала увеличивается на 1, а затем используется в выражении, во втором случае – сначала используется, а затем увеличивается. То есть, если n = 5, то x = n++; установит x равным 5, а n равным 6.

Побитовые операторы

В Си имеется шесть операторов для манипулирования с битами. Их можно применять только к целочисленным операндам:

& - побитовое И.

| - побитовое ИЛИ.

^ - побитовое исключающее ИЛИ.

<< - сдвиг влево.

>> - сдвиг вправо.

~ - побитовое отрицание (унарный).

Операторы и выражения присваивания

Выражения вида i = i+2 можно записывать в сокращенном виде i+=2. Оператор +=, как и оператор =, называется оператором присваивания. Большинству бинарных операторов соответствуют операторы присваивания op=, где op – один из операторов: + - * : % << >> & ^

Условный оператор

Инструкции вида if (a>b) z = a; else z = b; в Си можно записать с помощью тернарного (имеющего три операнда) оператора ?: (оно запишется так: z = (a>b)?a:b;).

Операторы, которые будут рассмотрены позже

Оператор () относится к вызову функции. Операторы -> и . (точка) обеспечивают доступ к элементам структур. Оператор sizeof предназначен для получения размера объекта. Оператор * представляет собой косвенное обращение по указателю. Оператор & предназначен для получения адреса объекта. Оператор [] предназначен для индексации элементов массива. Оператор :: - оператор разрешения области видимости. Оператор new предназначен для создания динамического объекта, delete – для удаления динамического объекта.

Приоритеты операторов

В таблице приведены приоритеты и очередность вычислений операторов, они упорядочены построчно в порядке убывания приоритетов; операторы, расположенные на одной строке, имеют одинаковый приоритет.

Операторы

Выполняются

() [] -> ::

Слева направо

++ -- (постфиксные)

Справа налево

! ~

++ -- (префиксные)

+ - (унарные)

* & (тип)

sizeof, new, delete

Справа налево

* / %

Слева направо

+ - (бинарные)

Слева направо

<< >>

Слева направо

< <= > >=

Слева направо

== !=

Слева направо

&

Слева направо

^

Слева направо

!

Слева направо

&&

Слева направо

||

Слева направо

?:

Справа налево

= += -= *= /= %= &= ^= |= <<= >>=

throw (генерация исключения)

Слева направо

, (запятая)

Слева направо

Управление.

Порядок, в котором выполняются вычисления, определяется инструкциями управления.

Выражение, скажем, x = 0, или i++, или printf(…) становится инструкцией, если в конце его поставить точку с запятой.

Фигурные скобки используются для объединения объявлений в составную инструкцию, или блок (например, фигурные скобки, обрамляющие тело функции main, или скобки, объединяющие инструкции внутри цикла for). После правой фигурной закрывающей скобки точка с запятой не ставится.

Конструкция if-else

Синтаксис конструкции:

if (выражение)

инструкция1;

[else инструкция2];

Сначала вычисляется выражение, если оно истинно (то есть отлично от нуля), выполняется инструкция 1, иначе инструкция 2.

Else связывают с ближайшим if, у которого нет else.

Например, в наборе инструкций:

if (a > 3)

if (b <=5)

c = 10;

else c = 20;

else относится ко второму if, что подчеркнуто с помощью отступов (обратите внимание на необходимость правильно форматировать ваш код).

Конструкция else-if.

Синтаксис конструкции:

if (выражение)

инструкция1;

else if (выражение)

инструкция2;

[else if (выражение)

инструкция3;]

[else инструкцияN;]

Выражения вычисляются по порядку: как только встречается выражение со значением «истина», выполняется соответствующая ему инструкция; на этом последовательность проверок завершается. Последняя else часть срабатывает, если не выполняются все предыдущие проверки.

Переключатель switch

Инструкция switch используется для выбора одного из многих вариантов. Оно проверяет, совпадает ли значение выражения с одним из значений, входящих в некоторое множество целых констант, и выполняет соответствующую этому выражению часть программы:

switch (выражение) {

case конст-выр: инструкции;

case конст-выр: инструкции;

default: инструкции;

}

Каждая ветвь case помечена одной или несколькими целочисленными константами или же константными выражениями. Если выяснилось, что ни одна из констант не подходит, то выполняется ветвь, помеченная словом default, если таковая имеется.

Инструкция break выполняет немедленный выход из переключателя switch:

switch (a){

case 1: cout << "Вы ввели 1"; break;

case 2: cout << "Вы ввели 2"; break;

case 3: cout << "Вы ввели 3"; break;

default: cout << "Вы неверно ввели число!"; break;

}

Циклы while и for

В цикле

while (выражение)

инструкция;

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

cout << "Введите число: ";

int a;

cin >> a;

cout << a << "! = ";

int b = 1;

while (a) // пока а не равно нулю

b *= a--; // умножаем b на a, затем уменьшаем а на единицу

cout << b;

Синтаксис цикла for:

for (выражение1; выражение2; выражение3)

инструкция;

Данная инструкция эквивалента следующей:

выражение1;

while (выражение2) {

инструкция;

выражение3;

}

Пример (вычисление факториала):

cout << "Введите число: ";

int a, b = 1;

cin >> a;

for (int i = 1; i <= a; i++)

b*=i;

cout << a << "! = " << b;

Цикл for чаще всего используется в случае, когда число итераций цикла известно до того, как он начнет выполняться (например, действия, выполняемые для всех элементов массива).

Цикл do-while

Синтаксис:

do

инструкция;

while (выражение);

Это так называемый цикл с постусловием. Его отличие от обычного while заключается в том, что условие продолжения работы цикла находится после его тела. Благодаря этому операторы, составляющие тело цикла, будут гарантированно выполнены хотя бы один раз.

Инструкции break и continue

Иногда бывает удобно выйти из цикла не по результату проверки, а каким-либо другим способом. Такую возможность для циклов for, while, do-while, а также для переключателя switch предоставляет инструкция break. Эта инструкция вызывает немедленный выход из объемлющего ее цикла.

Инструкция continue в чем-то похожа на break, но применяется реже. Она вынуждает ближайший объемлющий ее цикл (for, while или do-while) начать следующий шаг итерации. Для while и do-while это обозначает немедленный переход к проверке условия, а для for – к приращению шага.

Литература

  1. Керниган Б., Ритчи Д. Язык программирования Си. – СПб.: «Невский диалект», 2001. – 352 с.: ил.

  2. http://amse.ru/courses/cpp1/2009.10.16.html

  3. http://itandlife.ru/programming/cpp/tipy-dannyx-c/

  4. http://insidecpp.ru/information/operator_priorities/