- •4. Инкремент и декремент
- •5. Операции сравнения (операции отношения)
- •7. Ввод- вывод
- •10. Оператор цикла с постусловием do-while
- •13. Работа с символами
- •15. Указатели и Массивы.
- •16. Некоторые функции из библиотеки string.H
- •17. Перечисления (enum)
- •19. Функции
- •20. Передача данных в функцию по значению, по указателю, по ссылке.
- •21. Передача массивов в функцию. Указатель на функцию
- •22. Встраиваемые функции. Перегрузка функций. Передача массивов в функцию. Указатель на функцию
- •23. Параметры функций по умолчанию, функции с переменным числом параметров.
- •25. Работа с файлами
- •26. Директивы препроцессора
- •27. Базовые принципы объектно-ориентированного программирования
- •29. Базовые блоки ооп. Объект. Класс
- •30. Реализация механизма сокрытия информации
5. Операции сравнения (операции отношения)
Применяются для сравнения (сопоставления) числовой или символьной информации. Результатом выполнения операций является либо истина (true), либо ложь (false). Перечислим эти операции:
< — меньше;
<= — меньше или равно;
== — проверка на равенство (пишется два знака «равно» без пробелов);
!= — проверка на неравенство;
> — больше;
>= — больше или равно.
Приоритет этих операций ниже, чем у арифметических операций. Пример использования:
A+B>=C
Проверяем: сумма A и B больше С? Если «да», то ответом будет true, если «нет», то false.
В использовании операций сравнения нет ничего сложного. Но следует обратить внимание на одно обстоятельство.
Вещественные числа в памяти хранятся приближенно, при работе с ними в ходе выполнения арифметических операций могут накапливаться погрешности, поэтому не рекомендуется выполнять проверку на равенство или на неравенство для вещественных чисел, т.к. результат может быть непредсказуем. А если очень надо? Что делать?Поступаем просто. Если для вещественных чисел надо выполнить проверку на равенство (типа A==B), то заменяем её на проверку на неравенство вида
|A-B|<=ε,
где ε — некая малая положительная величина эпсилон.
В терминах языка C++ это будет выглядеть так
fabs(A-B)<=eps
Логические операции
Логические операции тесно связаны с операциями сравнения и используются для построения сложных логических выражений. Имеется три логические операции:
Приоритет операций логического сложения и умножения ниже, чем у арифметических операций и операций сравнения. Зато логическое отрицание имеет очень высокий приоритет.
Пример. Проверить, является ли число A двухзначным. Возможное решение:
A>9 && A<100
Поразрядные (побитовые) операции
Как известно, на компьютере в один приём, т.е. одной операцией, можно обрабатывать только данные размером в 1 байт или более. При этом в ряде случаев необходимо выяснить значения отдельных двоичных разрядов (битов). Для этих целей в языке C++ имеется большой набор операций, позволяющих выполнять различные действия над отдельными битами. Все побитовые операции допустимы только для целых типов. Перечислим эти операции:
При выполнении поразрядной операции И над соответствующими разрядами исходных операндов выполняется операция И. Она напоминает логическую операцию И, но только выполняется с отдельными битами. Если соответствующие биты в обоих операндах равны 1, то и соответствующие бит результата равен 1, иначе он равен 0. Побитовое выполнение этой операции представлено ниже:
При выполнении поразрядной операции ИЛИ всё происходит аналогично, только над разрядами выполняется операция ИЛИ: результат равен 0, если оба соответствующих разряда равны 0, иначе результат равен 1.
Поразрядное исключающее ИЛИ даёт нам другое правило для вычисления разрядов результата: результат равен 1, если разряды разные, и равен 0, если они одинаковые.
Инверсия — это одноместная операция, заменяющая каждый бит операнда на обратный: 0 на 1, а 1 на 0. Обратите внимание: инверсия — это не смена знака операнда.
6. Основные типы данных в C++
Основные (стандартные) типы данных часто называют арифметическими, поскольку их можно использовать в арифметических операциях. Для описания основных типов определены следующие ключевые слова:
int (целый);
char (символьный);
wchar_t (расширенный символьный);
bool (логический);
float (вещественный);
double (вещественный с двойной точностью).
Первые четыре тина называют целочисленными (целыми), последние два — типами с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.
Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:
short (короткий);
long (длинный);
signed (знаковый);
unsigned (беззнаковый).
Типы с плавающей точкой (float, double и long double)
Стандарт C++ определяет три типа данных для хранения вещественных значений: float, double и long double.
Типы данных с плавающей точкой хранятся в памяти компьютера иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка. В IBM PC-совместимых компьютерах величины типа float занимают 4 байта, из которых один двоичный разряд отводится под знак мантиссы, 8 разрядов под порядок и 23 под мантиссу. Мантисса — это число, большее 1.0, но меньшее 2.0. Поскольку старшая цифра мантиссы всегда равна 1, она не хранится.
Для величин типа double, занимающих 8 байт, под порядок и мантиссу отводится 11 и 52 разряда соответственно. Длина мантиссы определяет точность числа, а длина порядка — его диапазон. Как можно видеть из таблицы в конце записи, при одинаковом количестве байт, отводимом под величины типа float и long int, диапазоны их допустимых значений сильно различаются из-за внутренней формы представления.
Спецификатор long перед именем типа double указывает, что под его величину отводится 10 байт.
Константы с плавающей точкой имеют по умолчанию тип double. Можно явно указать тип константы с помощью суффиксов F, f (float) и L, l (long). Например, константа 2E+6L будет иметь тип long double, а константа 1.82f — тип float.
Для написания переносимых на различные платформы программ нельзя делать предположений о размере типа int. Для его получения необходимо пользоваться операцией sizeof, результатом которой является размер типа в байтах. Например, для операционной системы MS-DOS sizeof (int) даст в результате 2, а для Windows 98 или OS/2 результатом будет 4.
В стандарте ANSI диапазоны значений для основных типов не задаются, определяются только соотношения между их размерами, например:
sizeof(float) ≤ slzeof(double) ≤ sizeof(long double)
sizeof(char) ≤ slzeof(short) ≤ sizeof(int) ≤ sizeof(long)
Примечание
Минимальные и максимальные допустимые значения для целых типов зависят от реализации и приведены в заголовочном файле <limits.h> (<climits>), характеристики вещественных типов — в файле <float.h> (<cfloat>), а также в шаблоне класса numeric_limits
Тип void
Кроме перечисленных, к основным типам языка относится тип void, но множество значений этого типа пусто. Он используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей и в операции приведения типов.
Спецификаторами типов (спецификатор_типа) являются:
спецификатор_типа:
простое_имя_типа
class_спецификатор
enum-спецификатор
сложный_спецификатор_типа
const
Слово const можно добавлять к любому допустимому спецификатору_типа. В остальных случаях в описании может быть дано не более одного спецификатора_типа. Объект типа const не является lvalue. Если в описании опущен спецификатор типа, он принимается int.
простое_имя_типа:
char
short
int
long
unsigned
float
double
const
void
Слова long, short и unsigned можно рассматривать как прилагательные. Они могут применяться к типу int; unsigned может также применяться к типам char, short и long.
Спецификаторы класса и перечисления обсуждаются в #8.5 и #8.10 соответственно.
сложный_спецификатор_типа:
ключ typedef-имя
ключ идентификатор
ключ:
class
struct
union
enum
Сложный спецификатор типа можно использовать для ссылки на имя класса или перечисления там, где имя может быть скрыто локальным именем. Например:
class x { ... };
void f(int x)
{
class x a;
// ...
}
