View Categories

Сравнение

В 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 - сначала будет вычислено сравнение, затем - оператор И.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх