Необходимо учесть, что операции из таблицы 1 применяются к целым и что не существует отдельного типа данных для логических действий.
Таблица 1
Операции, применяемые к целым операндам
Смысл операции определяется числом операндов; унарное – операция взятия адреса, а бинарное – операция логического И.
Смысл операции определяется также типом ее операндов: + в выражении a + b означает сложение с плавающей точкой, если тип операндов float, но целое сложение, если их тип int.
В C++ существует операция присваивания =, а не оператор при-сваивания, как в некоторых языках. То есть присваивание может употребляться в неожиданном контексте; например, x = sqrt(a = 3*x).
Выражение a = b = c значит присвоение c объекту b, а потом объекту a. Другое свойство операции присваивания – она способна совмещаться с большинством бинарных операций. К примеру, x[i + 3]* = 4 имеет значение x[i + 3] = x[i + 3]*4, за исключением того, что выражение x[i + 3] определяется только один раз. Это дает большую степень эффективности без необходимости употребления оптимизирующего компилятора. К тому же это менее длинно.
Во многих программах на C++ широко используются указатели.
Унарная операция * разыменовывает указатель, т. е. *p представляет собой объект, на который указывает p. Данная операция также именуется косвенной адресацией. Например, если имеется char* p, то *p – это символ, на который указывает p. Часто при работе с указателями применяются операция увеличения ++ и операция уменьшения —.
24. Оператор выражение. Пустой оператор
Самый простой вид оператора – оператор выражение. Он включает в себя выражение, за которым следует точка с запятой.
К примеру:
a = b*3 + c;
cout «go go go»; lseek(fd,0,2); Простейший оператор – пустой оператор:
Он не делает ничего. Но он используется тогда, когда синтаксис требует присутствия оператора, а данный оператор не нужен.
Блок представляет собой возможно пустой список операторов, находящихся в фигурных скобках:
{a = b + 2; b++;}
Блок дает возможность рассматривать несколько операторов как один. Область видимости имени, которая описана в блоке, простирается до конца блока. Имя может быть невидимым с помощью описаний такого же имени во внутренних блоках.
Программа в следующем примере производит преобразование дюймов в сантиметры и сантиметров в дюймы; предполагается, что указаны единицы измерения вводимых данных, добавляется i для дюймов и c для сантиметров:
#include main
const float fac = 2.54; float x, in, cm; char ch = 0;
cout «введите длину: «; cin x ch;
if (ch == { // inch – дюймы
in = x;
cm = x*fac;
}
else if (ch == 'c') // cm – сантиметры in = x/fac; cm = x;
}
else
in = cm = 0;
cout in «in=» cm «cm\n»;}
25. Оператор switch, break. Копирование строки
Оператор switch дает возможность сопоставления значения с множеством констант. Проверки в предыдущем примере можно представить в следующем виде:
switch (ch) {
case
in = x;
cm = x*fac;
break;
case 'c':
in = x/fac;
cm = x;
break;
default:
in = cm = 0;
break;
}
Операторы break используются для выхода из оператора switch. Константы в вариантах case могут иметь различные значения, и если проверяемое значение не совпадает ни с одной из констант, принимается вариант default. Программист не обязательно должен предусматривать default.
Покажем копирование строки, когда заданы указатель p на ее первый символ и указатель q на целевую строку. По соглашению строка заканчивается символом с целым значением 0.
while (p!= 0) {
*q = *p; // скопировать символ q = q+1;
p = p+1;
*q = 0; // завершающий символ 0 скопирован не был.
После while любое условие должно находиться в круглых скобках. Условие вычисляется, и, если оно не нулевое, выполняется непосредственно следующий за ним оператор. Это происходит до тех пор, пока вычисление условия не даст ноль.
Можно применять операцию ++ для непосредственного указания увеличения, и проверка будет значительно проще:
while (*p) *q++ = *p++;
*q = 0;
где конструкция *p++ значит: «взять символ, на который задает p, затем увеличить p».
26. Описание функций
При использовании операции ++ к целой переменной к ней просто добавляется единица. Первая часть оператора for не обязательно должна быть описанием, она может быть простым оператором. К примеру:
for (i=0; i10; i++) q[i]=»p[i];»
тоже по смыслу соответствует предыдущей записи при условии, что i соответствующим образом описано раньше.
Описание представляет собой оператор, который вводит имя в программе. Оно способно и инициализировать объект с этим именем. Выполнение описания значит, что при достижении потоком управления описания вычисляется инициализирующее выражение (инициализатор) и наблюдалась инициализация.
Например:
for (int i = 1; i
Функция является именованной частью программы, к которой можно обращаться из других частей программы любое количество раз. Покажем программу, печатающую степени числа 2:
extern float pow(float, int); //pow
main
for (int i=0; i10; cout pow(2,i) «\n»; }