k = 255; k = k + 2; cout << k; 257 в переменной храниться не может, т.к. 8 бит не могут представить данное число. При этом ошибки также не будет. 255 (11111111) + 2 (00000010) = 257 (100000001) 100000001 содержит 9 элементов. Под переменную выделено 8 байт. Соответственно первый элемент будет отброшен, а оставшиеся 8 сохранены: 00000001 (1). И на экран будет выведено 1. Это явление называется переполнением и может возникать достаточно часто.
Теперь рассмотрим синтаксис (формальный язык с помощью которого записываются различные конструкции в коде программы) объявления переменных в c++:
«тип_данных имя_переменной;». Например, «int a;» Можно объявить сразу несколько переменных одного типа. Для этого нужно перечислить имена переменных через запятую: «int a, b, c;»
Некоторым переменным можно сразу присвоить определенные значения:
«int x = 0, y = 0, z;». Вместо конкретных значений могут быть использованы любые выражения. Стоит отметить, что объявление переменной также является командой и должно идти до любого использования этой переменной. Объявление может быть внутри главной (или любой другой) функции – локальная переменная или за ее пределами (аналогично команде using namespace std;) – глобальная переменная.
При увеличении размера программы, глобальные переменные могут создавать проблемы и непредсказуемое поведение, потому применять их следует только при необходимости.
Также любая переменная может быть объявлена константой, если указать до типа ключевое слово «const»: «const int t = 0;». Константа может получить значение только один раз. В дальнейшем по ее имени можно получать значение, но любая попытка изменения значения вызовет ошибку. Типы переменных, используемые в данном пособии, приведены в таблице 1.
Таблица 1 Некоторые типы данных в языке c++
При этом необходимо понимать, что размер и диапазон в редких случаях могут отличаться в зависимости от используемого компилятора и целевой операционной системы.
Например, char может изменяться в диапазоне 0…255, int может занимать 2 байта. Если в процессе выполнения необходимо узнать точное количество байт необходимо вызывать sizeof(тип). Например, sizeof(int), sizeof(double). Для определения границ целочисленных типов можно использовать константы из библиотеки «limits.h», значения которых понятно по их названиям: INT_MIN, INT_MAX, CHAR_MIN, CHAR_MAX. Для указания максимальных значений беззнаковых типов (которые начинаются с unsigned) используются UINT_MAX, UCHAR_MAX (минимальные значения, очевидно, 0).
Для определения границ типов для представления чисел с плавающей точкой (дробные) можно использовать константы из «float.h»:FLT_MIN, FLT_MAX, DBL_MIN, DBL_MAX Также, при работе с числами с плавающей точкой, в связи с особенностями их представления, можно увидеть записи, похожие на 1.34e-23. Такая запись означает, что число равно
Также стоит помнить, что такие числа до определенного значения хранятся как точные значения, а после них как приближенные. Это значит, что после этого значения даже предположительно одинаковые числа могут быть не равны. Например, если объявить переменные float t1 = 1, t2 = 1. Затем t1 умножить на 1.452123 и 10 раз на 2.456, а t2 10 раз на 2.456 и потом на 1.452123, то оба числа будут представлены как 11595.4, но при сравнении не будут равны.
Аналогично для double со значением 1.61315e+78. Отдельно можно выделить тип char, который является целым числом, но может обрабатываться и как число и как символ.
Тип bool может принимать всего 2 значения, потому с его помощью удобно вычислять логические выражения, которые будут рассмотрены позднее. Также для удобства для него заведено 2 константы: true (да; истина) = 0, false (нет; ложь).
Для лучшей читаемости кода для данного типа лучше пользоваться именно ими, а не непосредственно 0 и 1.
Отдельно стоит указать тип «string». Переменные данного типа могут хранить строки. Данный тип сильно отличается от ранее приведенных. Также он находится в пространстве имен «std», т.е. полное имя «std::string». Однако, процесс ввода значения в переменные данного типа и вывод их в консоль не сильно отличается от других типов. Поэтому для подобных действий тип можно использовать уже в этой работе. Зная вышеописанное можно начать формализовывать алгоритм, приведенный на рис. 3б: