В C/C++ можно сравнить два значения при помощи операторов сравнения. Результат сравнения - логическая величина:
==
равно (a == b)!=
не равно (a != b)>
больше (a > b)<
меньше (a < b)>=
больше или равно (a >= b)<=
меньше или равно (a <= b)
Сравнивать между собой можно любые численные данные - переменные и константы в любых сочетаниях:
int a = 5, b = 10;
a > b; // false
a < b; // true
a == 5; // true
a >= 5; // true
a != b; // true
Целые числа #
Как вы помните из урока про типы данных, знаковые и беззнаковые числа отличаются при хранении в памяти, поэтому при сравнении беззнакового числа со знаковым могут возникать ошибки, и они точно будут, если число отрицательное.
Компилятор выдаст предупреждение при попытке сравнить беззнаковое число со знаковым
Для корректного сравнения целочисленных типов они должны быть приведены к одному типу, иначе компилятор сделает это сам - компилятор приводит знаковое к беззнаковому типу. Если оно было отрицательным - получится другое число и сравнение будет некорректным! Также компилятор приведёт данные к следующему по размеру типу, чтобы сравнение получилось корректным:
// пример для 2-х байтного int
5 > -5; // true
int16_t v = -5;
uint16_t uv = 5;
uv > v; // false, потому что компилятор перевёл v к unsigned
uv > (uint16_t)v; // false - фактически сделал так
5u > -5; // false, аналогично в цифрах
(int16_t)uv > v; // true, привели вручную
(int32_t)uv > (int32_t)v; // true, привели вручную
65535 > -1u; // false
65535 == -1u; // true!
65535 > -1; // true
65535 == -1; // false, компилятор привёл к int32
// в то же время
18446744073709551615 == -1; // true
// потому что самый большой тип, больше уже некуда
18446744073709551615 > -2; // true
Float числа #
Из урока про типы данных вы помните, что float
имеет ограниченную точность, поэтому float
числа не рекомендуется сравнивать через строгое равенство! Это можно делать, если значение в переменной предсказуемое, например:
float f = 0;
f == 0; // true
f = 3.14;
f == 3.14; // true
f = 1.1 - 1.0;
f == 0.1; // false! Здесь f ~ 0.100000023
Категорически не рекомендуется сравнивать float
числа через строгое равенство ==
Двойное неравенство #
Двойные (и более) неравенства вычисляются не так, как на "бумаге". Например 0 < a < 10
- сначала будет вычислено 0 < a
, результат - логическая величина, то есть 0
или 1
. И уже это значение будет сравниваться с 10
, что приведёт к некорректному результату. Для записи таких условий нужно разделить неравенство на одиночные и соединить их оператором И, исправленный пример: (0 < a) && (a < 10)
.
Приоритет операций #
В языке существует строгий приоритет операций, т.е. какие операции будут выполняться сначала, а какие - потом. Вот тут есть табличка. В данном случае нас интересует логика и сравнение - у операторов сравнения приоритет выше, чем у логических операторов, то есть пример с двойным неравенством выше можно переписать без скобок и он будет работать точно так же: 0 < a && a < 10
- сначала будет вычислено сравнение, затем - оператор И.