Сравнение (программирование)

Сравне́ние в программировании — общее название ряда операций над па́рами значений одного типа, либо с приведением типа, реализующих математические отношения равенства и порядка. В языках высокого уровня такие операции, чаще всего, возвращают булево значение («истина» или «ложь»). 

По-разному рассматривается сравнение скалярных (числовых) объектов, указателей и объектов сложных типов данных.

Сравнение скалярных типов данных 

При сравнении объектов скалярных (числовых) типов данных сравнивается непосредственно сами хранимые числовые значения. Сами числовые значения, при этом, остаются неизменными.

В языках низкого уровня скалярные объекты записываются в регистры процессора, а для их сравнения используется, обычно, команда CMP, которая определённым образом устанавливает флаги процессора. 

В языках высокого уровня используются логические операторы, которые возвращают (в точку вызова) некоторое значение, которое интерпретируется как логическое.

Логические операторы реализуют следующие математические операции сравнения:
 Проверка на равенство () или/и неравенство ();
 Проверка на строгое неравенство ( и );
 Проверка на нестрогое неравенство ( и ).

В языках высокого уровня, соответственно, реализованы следующие логические операторы:
 Проверка на равенство (= в Паскале и == в Си) и неравенства (<> в Паскале и != в Си);
 Отношение строгого порядка (< и >);
 Отношение нестрогого порядка (<=, >=).

В языках со слабой типизацией возвращаемое значение, обычно, является целым числом так, что нулевое значение интерпретируется как «ложь», а любое отличное от нуля значение — как «истина». В языках с более сильной типизацией вводится специальный логический тип данных (), но возможно приведение других типов к логическому.

Сравнение нечисловых данных 
Даже если аргументы сравнения не представляют собой числовые данные, их сравнение всё равно может быть реализовано, в том числе как часть стандарта языка программирования. При работе со сложными объектами программа оперирует с ними с помощью указателей. Таким образом, появляется как минимум два варианта сравнения данных:
 Сравнение указателей — сравнение значений указателей. Равенство указателей означает, что две переменных указывают на один и тот же объект данных (участок памяти).
 Сравнение содержимого — сравнение объектов с точки зрения логики на основе знания их содержимого. Например, сравнение строк.

Некоторые языки, ограничивающие работу с указателями, например, Java, хотя не позволяют сравнивать указатели операндами больше-меньше, позволяют проверить равенство указателей.

Сравнение содержимого, например, сравнение строк, чаще всего встроена в реализацию среды исполнения для языка и может являться частью стандарта. Однако допускается самостоятельная реализация правил сравнения содержимого для пользовательских структур путём перегрузки операторов (Си) или определения (переопределения) методов (Object.equals и интерфейс Comparable в Java). Для встроенных типов данных (например, String) хотя часто нельзя переопределить правила сравнения, их можно настроить с учётом текущей языка и локализации, а также использовать собственные реализации правил сравнения с функциями сортировки (интерфейс Comparator в Java).

Некоторые стандарты, например DOM Level 3, определяет дополнительные типы эквивалентности. В частности, стандарт DOM Level 3 предполагает, что один и тот же элемент документа может быть представлен двумя и более участками в памяти компьютера. Поэтому определяется дополнительная операция isSameNode, которая является проверкой равенства содержимого с точки зрения языка программирования, но фактически является проверкой эквивалентности указателей с точки зрения стандарта DOM.

В некоторых языках в качестве эквивалентных также могут рассматриваться значения близкие по смысловой нагрузке, хотя и имеющие разные типы, например, пустая строка, пустой массив, число 0, нулевой (null) указатель, ложь — имеют смысл пустоты, отрицания.

Примечания 

Концепции языков программирования