В разделе 2.1.1 упоминалось, что значения типа bool
не нужно использовать для вычислений. Результат -b
— хороший пример того, что имелось в виду.
Для большинства операторов операнды типа bool
преобразуются в тип int
. В данном случае значение переменной b
, true
, преобразуется в значение 1
типа int
(см. раздел 2.1.2). Это (преобразованное) значение преобразуется в отрицательное, -1
. Значение -1
преобразуется обратно в тип bool
и используется для инициализации переменной b2
. Поскольку значение инициализатора отлично от нуля, при преобразовании в тип bool
его значением станет true
. Таким образом, значением b2
будет true
!
Некоторые арифметические выражения возвращают неопределенный результат. Некоторые из этих неопределенностей имеют математический характер, например деление на нуль. Причиной других являются особенности компьютеров, например, переполнение, происходящее при превышении вычисленным значением размера области памяти, представленной его типом.
Предположим, тип short
занимает на машине 16 битов. В этом случае переменная типа short
способна хранить максимум значение 32767. На такой машине следующий составной оператор присвоения приводит к переполнению.
short short_value = 32767; //
short_value += 1; //
cout << "short_value: " << short_value << endl;
Результат присвоения 1 переменной short_value
непредсказуем. Для хранения знакового значения 32768 требуется 17 битов, но доступно только 16. Многие системы
short value: -32768
Здесь произошло переполнение переменной: предназначенный для знака разряд содержал значение 0
, но был заменен на 1
, что привело к появлению отрицательного значения. На другой системе результат мог бы быть иным, либо программа могла бы повести себя по-другому, включая полный отказ.
Примененные к объектам арифметических типов, операторы +
, -
, *
и /
имеют вполне очевидные значения: сложение, вычитание, умножение и деление. Результатом деления целых чисел является целое число. Получаемая в результате деления дробная часть отбрасывается.
int ival1 = 21/6; //
//
int ival2 = 21/7; //
//
Оператор %
известен как
int ival = 42;
double dval = 3.14;
ival % 12; //
ival % dval; //