Сравнение (программирование)
Сравне́ние в программировании — общее название ряда операций над па́рами значений одного типа, либо с приведением типа, реализующих математические отношения равенства и порядка. В языках высокого уровня такие операции, чаще всего, возвращают булево значение («истина» или «ложь»).
По-разному рассматривается сравнение скалярных (числовых) объектов, указателей и объектов сложных типов данных.
Сравнение скалярных типов данных
При сравнении объектов скалярных (числовых) типов данных сравнивается непосредственно сами хранимые числовые значения. Сами числовые значения, при этом, остаются неизменными.
В языках низкого уровня скалярные объекты записываются в регистры процессора, а для их сравнения используется, обычно, команда CMP
, которая определённым образом устанавливает флаги процессора.
В языках высокого уровня используются логические операторы, которые возвращают (в точку вызова) некоторое значение, которое интерпретируется как логическое.
Логические операторы реализуют следующие математические операции сравнения:
- Проверка на равенство () или/и неравенство ();
- Проверка на строгое неравенство ( и );
- Проверка на нестрогое неравенство ( и ).
В языках высокого уровня, соответственно, реализованы следующие логические операторы:
- Проверка на равенство (
=
в Паскале и==
в Си) и неравенства (<>
в Паскале и!=
в Си); - Отношение строгого порядка (
<
и>
); - Отношение нестрогого порядка (
<=
,>=
).
В языках со слабой типизацией возвращаемое значение, обычно, является целым числом так, что нулевое значение интерпретируется как «ложь», а любое отличное от нуля значение — как «истина». В языках с более сильной типизацией вводится специальный логический тип данных (англ. boolean), но возможно приведение других типов к логическому.
Сравнение нечисловых данных
Даже если аргументы сравнения не представляют собой числовые данные, их сравнение всё равно может быть реализовано, в том числе как часть стандарта языка программирования. При работе со сложными объектами программа оперирует с ними с помощью указателей. Таким образом, появляется как минимум два варианта сравнения данных:
- Сравнение указателей — сравнение значений указателей. Равенство указателей означает, что две переменных указывают на один и тот же объект данных (участок памяти).
- Сравнение содержимого — сравнение объектов с точки зрения логики на основе знания их содержимого. Например, сравнение строк.
Некоторые языки, ограничивающие работу с указателями, например, Java, хотя не позволяют сравнивать указатели операндами больше-меньше, позволяют проверить равенство указателей.
Сравнение содержимого, например, сравнение строк, чаще всего встроена в реализацию среды исполнения для языка и может являться частью стандарта. Однако допускается самостоятельная реализация правил сравнения содержимого для пользовательских структур путём перегрузки операторов (Си) или определения (переопределения) методов (Object.equals
и интерфейс Comparable
в Java). Для встроенных типов данных (например, String
) хотя часто нельзя переопределить правила сравнения, их можно настроить с учётом текущей языка и локализации, а также использовать собственные реализации правил сравнения с функциями сортировки (интерфейс Comparator
в Java).
Некоторые стандарты, например DOM Level 3, определяет дополнительные типы эквивалентности. В частности, стандарт DOM Level 3 предполагает, что один и тот же элемент документа может быть представлен двумя и более участками в памяти компьютера. Поэтому определяется дополнительная операция isSameNode
, которая является проверкой равенства содержимого с точки зрения языка программирования, но фактически является проверкой эквивалентности указателей с точки зрения стандарта DOM.[1]
В некоторых языках в качестве эквивалентных также могут рассматриваться значения близкие по смысловой нагрузке, хотя и имеющие разные типы, например, пустая строка, пустой массив, число 0, нулевой (null) указатель, ложь — имеют смысл пустоты, отрицания.