ЛЕКЦИЯ №17
Общая информация
Встроенные типы данных предопределены в языке. Это самые простые величины, из которых составляют все производные типы, в том числе и классы. Различные реализации и компиляторы могут определять различные диапазоны значений целых и вещественных чисел.
В таблице 1 перечислены простейшие типы данных, которые определяет язык Си++, и приведены наиболее типичные диапазоны их значений.
| Название | Обозначение | Диапазон значений |
|---|---|---|
| Байт | char | от -128 до +127 |
| без знака | unsigned char | от 0 до 255 |
| Короткое целое число | short | от -32768 до +32767 |
| Короткое целое число без знака | unsigned short | от 0 до 65535 |
| Целое число | int | от – 2147483648 до + 2147483647 |
| Целое число без знака | unsigned int (или просто unsigned) | от 0 до 4294967295 |
| Длинное целое число | long | от – 2147483648 до + 2147483647 |
| Длинное целое число без знака | unsigned long | от 0 до 4294967295 |
| Вещественное число одинарной точности | float | от ±3.4e-38 до ±3.4e+38 (7 значащих цифр) |
| Вещественное число двойной точности | double | от ±1.7e-308 до ±1.7e+308 (15 значащих цифр) |
| Вещественное число увеличенной точности | long double | от ±1.2e-4932 до ±1.2e+4932 |
| Логическое значение | bool | значения true(истина) или false (ложь) |
Целые числа
Для представления целых чисел в языке Си++ существует несколько типов – char, short, int и long (полное название типов: short int, long int, unsigned long int и т.д.. Поскольку описатель int можно опустить, мы используем сокращенные названия). Они отличаются друг от друга диапазоном возможных значений. Каждый из этих типов может быть знаковым или беззнаковым. По умолчанию, тип целых величин – знаковый. Если перед определением типа стоит ключевое слово unsigned , то тип целого числа — беззнаковый. Для того чтобы определить переменную x типа короткого целого числа, нужно записать:
short x;
Число без знака принимает только положительные значения и значение ноль. Число со знаком принимает положительные значения, отрицательные значения и значение ноль.
Целое число может быть непосредственно записано в программе в виде константы. Запись чисел соответствует общепринятой нотации. Примеры целых констант: 0, 125, -37. По умолчанию целые константы принадлежат к типу int. Если необходимо указать, что целое число — это константа типа long , можно добавить символ L или l после числа. Если константа беззнаковая, т.е. относится к типу unsigned long или unsigned int , после числа записывается символ U или u. Например: 34U, 700034L, 7654ul.
Кроме стандартной десятичной записи, числа можно записывать в восьмеричной или шестнадцатеричной системе счисления. Признаком восьмеричной системы счисления является цифра 0 в начале числа. Признаком шестнадцатеричной — 0x или 0X перед числом. Для шестнадцатеричных цифр используются латинские буквы от A до F (неважно, большие или маленькие).
Таким образом, фрагмент программы
const int x = 240;
const int y = 0360;
const int z = 0x0F0;
определяет три целые константы x, y и z с одинаковыми значениями.
Отрицательные числа предваряются знаком минус "-". Приведем еще несколько примеров:
// ошибка в записи восьмеричного числа
const unsigned long ll = 0678;
// правильная запись
const short a = 0xa4;
// ошибка в записи десятичного числа
const int x = 23F3;
Для целых чисел определены стандартные арифметические операции сложения (+), вычитания (-), умножения (*), деления (/); нахождение остатка от деления (%), изменение знака (-). Результатом этих операций также является целое число. При делении остаток отбрасывается. Примеры выражений с целыми величинами:
x + 4;
30 — x;
x * 2;
-x;
10 / x;
x % 3;
Кроме стандартных арифметических операций, для целых чисел определен набор битовых (или поразрядных) операций. В них целое число рассматривается как строка битов (нулей и единиц при записи числа в двоичной системе счисления или разрядов машинного представления).
К этим операциям относятся поразрядные операции И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, поразрядное отрицание и сдвиги. Поразрядная операция ИЛИ, обозначаемая знаком |, выполняет операцию ИЛИ над каждым индивидуальным битом двух своих операндов. Например, 1 | 2 в результате дают 3, поскольку в двоичном виде 1 это 01, 2 – это 10, соответственно, операция ИЛИ дает 11 или 3 в десятичной системе (нули слева мы опустили).
Аналогично выполняются поразрядные операции И, ИСКЛЮЧАЮЩЕЕ ИЛИ и отрицание.
3 | 1 результат 3 4 & 7 результат 4 4 ^ 7 результат 3 0 & 0xF результат 0 ~0x00F0 результат 0xFF0F
Операция сдвига перемещает двоичное представление левого операнда на количество битов, соответствующее значению правого операнда. Например, двоичное представление короткого целого числа 3 – 0000000000000011. Результатом операции 3 << 2 (сдвиг влево) будет двоичное число 0000000000001100 или, в десятичной записи, 12. Аналогично, сдвинув число 9 (в двоичном виде 0000000000001001) на 2 разряда вправо (записывается 9 >> 2) получим 0000000000000010, т.е. 2.
При сдвиге влево число дополняется нулями справа. При сдвиге вправо бит, которым дополняется число, зависит от того, знаковое оно или беззнаковое. Для беззнаковых чисел при сдвиге вправо они всегда дополняются нулевым битом. Если же число знаковое, то значение самого левого бита числа используется для дополнения. Это объясняется тем, что самый левый бит как раз и является знаком — 0 означает плюс и 1 означает минус. Таким образом, если
short x = 0xFF00;
unsigned short y = 0xFF00;
то результатом x >> 2 будет 0xFFC0 (двоичное представление 1111111111000000), а результатом y >> 2 будет 0x3FC0 (двоичное представление 0011111111000000).
Рассмотренные арифметические и поразрядные операции выполняются над целыми числами и в результате дают целое число. В отличие от них операции сравнения выполняются над целыми числами, но в результате дают логическое значение истина ( true ) или ложь ( false ).
Для целых чисел определены операции сравнения: равенства (==), неравенства (!=), больше (>), меньше (<), больше или равно (>=) и меньше или равно (<=).
Последний вопрос, который мы рассмотрим в отношении целых чисел, – это преобразование типов. В языке Си++ допустимо смешивать в выражении различные целые типы. Например, вполне допустимо записать x + y, где x типа short , а y – типа long . При выполнении операции сложения величина переменной x преобразуется к типу long . Такое преобразование можно произвести всегда, и оно безопасно, т.е. мы не теряем никаких значащих цифр. Общее правило преобразования целых типов состоит в том, что более короткий тип при вычислениях преобразуется в более длинный. Только при выполнении присваивания длинный тип может преобразовываться в более короткий. Например:
short x;
long y = 15;
. . .
x = y;
// преобразование длинного типа
// в более короткий
Такое преобразование не всегда безопасно, поскольку могут потеряться значащие цифры. Обычно компиляторы, встречая такое преобразование, выдают предупреждение или сообщение об ошибке.
Вещественные числа
Вещественные числа в Си++ могут быть одного из трех типов: с одинарной точностью — float , с двойной точностью – double , и с расширенной точностью – long double.
float x;
double e = 2.9;
long double s;
В большинстве реализаций языка представление и диапазоны значений соответствуют стандарту IEEE (Institute of Electrical and Electronics Engineers) для представления вещественных чисел. Точность представления чисел составляет 7 десятичных значащих цифр для типа float , 15 значащих цифр для double и 19 — для типа long double .
Вещественные числа записываются либо в виде десятичных дробей, например 1.3, 3.1415, 0.0005, либо в виде мантиссы и экспоненты: 1.2E0, 0.12e1. Отметим, что обе предыдущие записи изображают одно и то же число 1.2.
По умолчанию вещественная константа принадлежит к типу double . Чтобы обозначить, что константа на самом деле float , нужно добавить символ f или F после числа: 2.7f. Символ l или L означает, что записанное число относится к типу long double .
const float pi_f = 3.14f;
double pi_d = 3.1415;
long double pi_l = 3.1415L;
Для вещественных чисел определены все стандартные арифметические операции сложения (+), вычитания (-), умножения (*), деления (/) и изменения знака (-). В отличие от целых чисел, операция нахождения остатка от деления для вещественных чисел не определена. Аналогично, все битовые операции и сдвиги к вещественным числам неприменимы; они работают только с целыми числами. Примеры операций:
2 * pi;
(x – e) / 4.0
Вещественные числа можно сравнивать на равенство (==), неравенство (!=), больше (>), меньше (<), больше или равно (>=) и меньше или равно (<=). В результате операции сравнения получается логическое значение истина или ложь.
Если арифметическая операция применяется к двум вещественным числам разных типов, то менее точное число преобразуется в более точное, т.е. float преобразуется в double и double преобразуется в long double . Очевидно, что такое преобразование всегда можно выполнить без потери точности.
Если вторым операндом в операции с вещественным числом является целое число, то целое число преобразуется в вещественное представление.
Хотя любую целую величину можно представить в виде вещественного числа, при таком преобразовании возможна потеря точности (для больших чисел).
Логические величины
В языке Си++ существует специальный тип для представления логических значений bool . Для величин этого типа существует только два возможных значения: true (истина) и false (ложь). Объявление логической переменной выглядит следующим образом:
bool condition;
Соответственно, существуют только две логические константы – истина и ложь. Они обозначаются, соответственно, true и false .
Для типа bool определены стандартные логические операции: логическое И (&&), ИЛИ (||) и НЕ (!).
// истинно, если обе переменные,
// cond1 и cond2, истинны
cond1 && cond2
// истинно, если хотя бы одна из переменных
// истинна
cond1 || cond2
// результат противоположен значению cond1
!cond1
Как мы уже отмечали ранее, логические значения получаются в результате операций сравнения. Кроме того, в языке Си++ принято следующее правило преобразования чисел в логические значения: ноль соответствует значению false , и любое отличное от нуля число преобразуется в значение true . Поэтому можно записать, например:
int k = 100;
while (k) { // выполнить цикл 100 раз
k--;
}
Символы и байты
Символьный или байтовый тип в языке Си++ относится к целым числам, однако мы выделили их в особый раздел, потому что запись знаков имеет свои отличия.
Итак, для записи знаков в языке Си++ служат типы char и unsigned char . Первый – это целое число со знаком, хранящееся в одном байте, второй – беззнаковое байтовое число. Эти типы чаще всего используются для манипулирования символами, поскольку коды символов как раз помещаются в байт.
Пояснение. Единственное, что может хранить компьютер, это числа. Поэтому для того чтобы можно было хранить символы и манипулировать ими, символам присвоены коды – целые числа. Существует несколько стандартов, определяющих, какие коды каким символам соответствуют. Для английского алфавита и знаков препинания используется стандарт ASCII. Этот стандарт определяет коды от 0 до 127. Для представления русских букв используется стандарт КОИ-8 или CP-1251. В этих стандартах русские буквы кодируются числами от 128 до 255. Таким образом, все символы могут быть представлены в одном байте (максимальное число символов в одном байте – 255). Для работы с китайским, японским, корейским и рядом других алфавитов одного байта недостаточно, и используется кодировка с помощью двух байтов и, соответственно, тип wchar_t (подробнее см. ниже).
Чтобы объявить переменную байтового типа, нужно записать:
char c; // байтовое число со знаком unsigned char u; // байтовое число без знака
Поскольку байты – это целые числа, то все операции с целыми числами применимы и к байтам. Стандартная запись целочисленных констант тоже применима к байтам, т.е. можно записать:
c = 45;
где c — байтовая переменная. Однако для байтов существует и другая запись констант. Знак алфавита (буква, цифра, знак препинания), заключенный в апострофы, представляет собой байтовую константу, например:
'S' '&' '8' 'ф'
Числовым значением такой константы является код данного символа, принятый в Вашей операционной системе.
В кодировке ASCII два следующих оператора эквивалентны:
char c = 68; char c = 'D';
Первый из них присваивает байтовой переменной c значение числа 68. Второй присваивает этой переменной код латинской буквы D, который в кодировке ASCII равен 68.
Для обозначения ряда непечатных символов используются так называемые экранированные последовательности – знак обратной дробной черты, после которого стоит буква. Эти последовательности стандартны и заранее предопределены в языке:
\a звонок \b возврат на один символ назад \f перевод страницы \n новая строка \r перевод каретки \t горизонтальная табуляция \v вертикальная табуляция \' апостроф \" двойные кавычки \\ обратная дробная черта \? вопросительный знак
Для того чтобы записать произвольное байтовое значение, также используется экранированная последовательность: после обратной дробной черты записывается целое число от 0 до 255.
char zero = '\0'; const unsigned char bitmask = '\0xFF'; char tab = '\010';
Следующая программа выведет все печатные символы ASCII и их коды в порядке увеличения:
for (char c = 32; c < 127; c++)
cout << c << " " << (int)c << " ";
Однако напомним еще раз, что байтовые величины – это, прежде всего, целые числа, поэтому вполне допустимы выражения вида
'F' + 1 'a' < 23
и тому подобные. Тип char был придуман для языка Си, от которого Си++ достались все базовые типы данных. Язык Си предназначался для программирования на достаточно "низком" уровне, приближенном к тому, как работает процессор ЭВМ, именно поэтому символ в нем – это лишь число.
В языке Си++ в большинстве случаев для работы с текстом используются специально разработанные классы строк, о которых мы будем говорить позже.
Кодировка, многобайтовые символы
Мы уже упоминали о наличии разных кодировок букв, цифр, знаков препинания и т.д. Алфавит большинства европейских языков может быть представлен однобайтовыми числами (т.е. кодами в диапазоне от 0 до 255). В большинстве кодировок принято, что первые 127 кодов отводятся для символов, входящих в набор ASCII: ряд специальных символов, латинские заглавные и строчные буквы, арабские цифры и знаки препинания. Вторая половина кодов – от 128 до 255 отводится под буквы того или иного языка. Фактически, вторая половина кодовой таблицы интерпретируется по-разному, в зависимости от того, какой язык считается "текущим". Один и тот же код может соответствовать разным символам в зависимости от того, какой язык считается "текущим".
Однако для таких языков, как китайский, японский и некоторые другие, одного байта недостаточно – алфавиты этих языков насчитывают более 255 символов.
Перечисленные выше проблемы привели к созданию многобайтовых кодировок символов. Двухбайтовые символы в языке Си++ представляются с помощью типа wchar_t :
wchar_t wch;
Тип wchar_t иногда называют расширенным типом символов, и детали его реализации могут варьироваться от компилятора к компилятору, в том числе может меняться и количество байт, которое отводится под один символ. Тем не менее, в большинстве случаев используется именно двухбайтовое представление.
Константы типа wchar_t записываются в виде L'ab'.
Наборы перечисляемых значений
Достаточно часто в программе вводится тип, состоящий лишь из нескольких заранее известных значений. Например, в программе используется переменная, хранящая величину, отражающую время суток, и мы решили, что будем различать ночь, утро, день и вечер. Конечно, можно договориться обозначить время суток числами от 1 до 4. Но, во-первых, это не наглядно. Во-вторых, что даже более существенно, очень легко сделать ошибку и,например, использовать число 5, которое не соответствует никакому времени дня. Гораздо удобней и надежнее определить набор значений с помощью типа enum языка Си++:
enum DayTime { morning, day, evening, night };
Теперь можно определить переменную
DayTime current;
которая хранит текущее время дня, а затем присваивать ей одно из допустимых значений типа DayTime:
current = day;
Контроль, который осуществляет компилятор при использовании в программе этой переменной, гораздо более строгий, чем при использовании целого числа.
Для наборов определены операции сравнения на равенство (==) и неравенство (!=) с атрибутами этого же типа, т.е.
if (current != night)
// выполнить работу
Вообще говоря, внутреннее представление значений набора – целые числа. По умолчанию элементам набора соответствуют последовательные целые числа, начиная с 0. Этим можно пользоваться в программе. Во-первых, можно задать, какое число какому атрибуту набора будет соответствовать:
enum { morning = 4, day = 3, evening = 2,
night = 1 };
// последовательные числа начиная с 1
enum { morning = 1, day, evening, night };
// используются числа 0, 2, 3 и 4
enum { morning, day = 2, evening, night };
Во-вторых, атрибуты наборов можно использовать в выражениях вместо целых чисел. Преобразования из набора в целое и наоборот разрешены.
Однако мы не рекомендуем так делать. Для работы с целыми константами лучше применять символические обозначения констант, а наборы использовать по их прямому назначению.
Что такое оператор
Запись действий, которые должен выполнить компьютер, состоит из операторов. При выполнении программы операторы выполняются один за другим, если только оператор не является оператором управления, который может изменить последовательное выполнение программы.
Различают операторы объявления имен, операторы управления и операторы-выражения.
Операторы-выражения
Выражения мы рассматривали в предыдущей лекции. Выражение, после которого стоит точка с запятой, – это оператор-выражение. Его смысл состоит в том, что компьютер должен выполнить все действия, записанные в данном выражении, иначе говоря, вычислить выражение. Чаще всего в операторе-выражении стоит операция присваивания или вызов функции. Операторы выполняются последовательно, и все изменения значений переменных, сделанные в предыдущем операторе, используются в последующих.
a = 1;
b = 3;
m = max(a, b);
Переменной a присваивается значение 1, переменной b – значение 3. Затем вызывается функция max с параметрами 1 и 3, и ее результат присваивается переменной m.
Как мы уже отмечали, присваивание – необязательная операция в операторе-выражении. Следующие операторы тоже вполне корректны:
x + y – 12; // сложить значения x и y и
// затем вычесть 12
func(d, 12, x); // вызвать функцию func с
// заданными параметрами
Объявления имен
Эти операторы объявляют имена, т.е. делают их известными программе. Все идентификаторы или имена, используемые в программе на языке Си++, должны быть объявлены.
Оператор объявления состоит из названия типа и объявляемого имени:
int x; // объявить целую переменную x
double f; // объявить переменную f типа
// double
const float pi = 3.1415;
// объявить константу pi типа float
// со значением 3.1415
Оператор объявления заканчивается точкой с запятой.
Операторы управления
Операторы управления определяют, в какой последовательности выполняется программа. Если бы их не было, операторы программы всегда выполнялись бы последовательно, в том порядке, в котором они записаны.
Условные операторы
Условные операторы позволяют выбрать один из вариантов выполнения действий в зависимости от каких-либо условий. Условие – это логическое выражение, т.е. выражение, результатом которого является логическое значение true (истина) или false (ложь).
Оператор if выбирает один из двух вариантов последовательности вычислений.
if (условие)
оператор1
else
оператор2
Если условие истинно, выполняется оператор1, если ложно, то выполняется оператор2.
if (x > y)
a = x;
else
a = y;
В данном примере переменной a присваивается значение максимума из двух величин x и y.
Конструкция else необязательна. Можно записать:
if (x < 0)
x = -x;
abs = x;
В данном примере оператор x = -x; выполняется только в том случае, если значение переменной x было отрицательным. Присваивание переменной abs выполняется в любом случае. Таким образом, приведенный фрагмент программы изменит значение переменной x на его абсолютное значение и присвоит переменной abs новое значение x.
Если в случае истинности условия необходимо выполнить несколько операторов, их можно заключить в фигурные скобки:
if (x < 0) {
x = -x;
cout << "Изменить значение x на
противоположное по знаку";
}
abs = x;
Теперь если x отрицательно, то не только его значение изменится на противоположное, но и будет выведено соответствующее сообщение. Фактически, заключая несколько операторов в фигурные скобки, мы сделали из них один сложный оператор или блок. Прием заключения нескольких операторов в блок работает везде, где нужно поместить несколько операторов вместо одного.
Условный оператор можно расширить для проверки нескольких условий:
if (x < 0)
cout << "Отрицательная величина";
else if (x > 0)
cout << "Положительная величина";
else
cout << "Ноль";
Конструкций else if может быть несколько.
Хотя любые комбинации условий можно выразить с помощью оператора if, довольно часто запись становится неудобной и запутанной. Оператор выбора switch используется, когда для каждого из нескольких возможных значений выражения нужно выполнить определенные действия. Например, предположим, что в переменной code хранится целое число от 0 до 2, и нам нужно выполнить различные действия в зависимости от ее значения:
switch (code) {
case 0:
cout << "код ноль";
x = x + 1;
break;
case 1 :
cout << "код один";
y = y + 1;
break;
case 2:
cout << "код два";
z = z + 1;
break;
default:
cout << "Необрабатываемое значение";
}
В зависимости от значения code управление передается на одну из меток case. Выполнение оператора заканчивается по достижении либо оператора break, либо конца оператора switch. Таким образом, если code равно 1, выводится "код один", а затем переменная y увеличивается на единицу. Если бы после этого не стоял оператор break, то управление "провалилось" бы дальше, была бы выведена фраза "код два", и переменная z тоже увеличилась бы на единицу.
Если значение переключателя не совпадает ни с одним из значений меток case, то выполняются операторы, записанные после метки default. Метка default может быть опущена, что эквивалентно записи:
default:
; // пустой оператор, не выполняющий
// никаких действий
Очевидно, что приведенный пример можно переписать с помощью оператора if:
if (code == 0) {
cout << "код ноль";
x = x + 1;
} else if (code == 1) {
cout << "код один";
y = y + 1;
} else if (code == 2) {
cout << "код два";
z = z + 1;
} else {
cout << "Необрабатываемое значение";
}
Пожалуй, запись с помощью оператора переключения switch более наглядна. Особенно часто переключатель используется, когда значение выражения имеет тип набора.
Операторы цикла
Предположим, нам нужно вычислить сумму всех целых чисел от 0 до 100. Для этого воспользуемся оператором цикла for:
int sum = 0;
int i;
for (i = 1; i <= 100; i = i + 1)
// заголовок цикла
sum = sum + i; // тело цикла
Оператор цикла состоит из заголовка цикла и тела цикла. Тело цикла – это оператор, который будет повторно выполняться (в данном случае – увеличение значения переменной sum на величину переменной i). Заголовок – это ключевое слово for, после которого в круглых скобках записаны три выражения, разделенные точкой с запятой. Первое выражение вычисляется один раз до начала выполнения цикла. Второе – это условие цикла. Тело цикла будет повторяться до тех пор, пока условие цикла истинно. Третье выражение вычисляется после каждого повторения тела цикла.
Оператор for реализует фундаментальный принцип вычислений в программировании – итерацию. Тело цикла повторяется для разных, в данном случае последовательных, значений переменной i. Повторение иногда называется итерацией. Мы как бы проходим по последовательности значений переменной i, выполняя с текущим значением одно и то же действие, тем самым постепенно вычисляя нужное значение. С каждой итерацией мы подходим к нему все ближе и ближе. С другим принципом вычислений в программировании – рекурсией – мы познакомимся в разделе, описывающем функции.
Любое из трех выражений в заголовке цикла может быть опущено (в том числе и все три). То же самое можно записать следующим образом:
int sum = 0;
int i = 1;
for (; i <= 100; ) {
sum = sum + i;
i = i + 1;
}
Заметим, что вместо одного оператора цикла мы записали несколько операторов, заключенных в фигурные скобки – блок. Другой вариант:
int sum = 0;
int i = 1;
for (; ;) {
if (i > 100)
break;
sum = sum + i;
i = i + 1;
}
В последнем примере мы опять встречаем оператор break. Оператор break завершает выполнение цикла. Еще одним вспомогательным оператором при выполнении циклов служит оператор продолжения continue. Оператор continue заставляет пропустить остаток тела цикла и перейти к следующей итерации (повторению). Например, если мы хотим найти сумму всех целых чисел от 0 до 100, которые не делятся на 7, можно записать это так:
int sum = 0;
for (int i = 1; i <= 100; i = i+1) {
if ( i % 7 == 0)
continue;
sum = sum + i;
}
Еще одно полезное свойство цикла for: в первом выражении заголовка цикла можно объявить переменную. Эта переменная будет действительна только в пределах цикла.
Другой формой оператора цикла является оператор while. Его форма следующая:
while (условие)
оператор
Условие – как и в условном операторе if – это выражение, которое принимает логическое значение "истина" или "ложь". Выполнение оператора повторяется до тех пор, пока значением условия является true (истина). Условие вычисляется заново перед каждой итерацией. Подсчитать, сколько десятичных цифр нужно для записи целого положительного числа N, можно с помощью следующего фрагмента:
int digits =0;
while (N > 0) {
digits = digits + 1;
N = N / 10;
}
Третьей формой оператора цикла является цикл do while. Он имеет форму:
do { операторы } while ( условие);
Отличие от предыдущей формы цикла while заключается в том, что условие проверяется после выполнения тела цикла. Предположим, требуется прочитать символы с терминала до тех пор, пока не будет введен символ "звездочка".
char ch;
do {
ch = getch(); // функция getch возвращает
// символ, введёный с
// клавиатуры
} while (ch != '*');
В операторах while и do также можно использовать операторы break и continue.
Как легко заметить, операторы цикла взаимозаменяемы. Оператор while соответствует оператору for:
for ( ; условие ; )
оператор
Пример чтения символов с терминала можно переписать в виде:
char ch;
ch = getch();
while (ch != '*') {
ch = getch();
}
Разные формы нужны для удобства и наглядности записи.
Оператор возврата
Оператор return завершает выполнение функции и возвращает управление в ту точку, откуда она была вызвана. Его форма:
return выражение;
Где выражение – это результат функции. Если функция не возвращает никакого значения, то оператор возврата имеет форму
return;
Оператор перехода
Последовательность выполнения операторов в программе можно изменить с помощью оператора перехода goto. Он имеет вид:
goto метка;
Метка ставится в программе, записывая ее имя и затем двоеточие. Например, вычислить абсолютную величину значения переменной x можно следующим способом:
if ( x >= 0)
goto positiv;
x = -x; // переменить знак x
positiv: // объявление метки
abs = x; // присвоить переменной abs
// положительное значение
При выполнении goto вместо следующего оператора выполняется оператор, стоящий после метки positiv. Если значение x положительное, оператор x = - x выполняться не будет.
В настоящее время считается, что оператор goto очень легко запутывает программу. Без него, вообще говоря, можно обойтись, поэтому лучше его не использовать, ну разве что лишь в самом крайнем случае.
Пример:
int fact(int n)
{
int k;
if (n == 1) {
k = 1;
} else {
k = n * fact(n – 1);
}
return k;
}
Это функция вычисления факториала. Первый оператор в ней – это объявление переменной k, в которой будет храниться результат вычисления. Затем выполняется условный оператор if. Если n равно единице, то вычисления факториала закончены, и выполняется оператор-выражение, который присваивает переменной значение 1. В противном случае выполняется другой оператор-выражение.
Последний оператор – это оператор возврата из функции.
