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

Материал из Seo Wiki - Поисковая Оптимизация и Программирование

Перейти к: навигация, поиск

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

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

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

Типы сравнений

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

В языках высокого уровня используются следующие булевозначные бинарные операции сравнения:

  • Проверка равенства (== в Си, = в ряде других языков…);
  • Проверка точного равенства (=== в PHP и ряде других языков…);
  • Проверка неравенства (!= в Си, <> в Паскале, то же что ≠ в математике) — отрицание равенства;
  • Проверка точного неравенства (!== в PHP и ряде других языков…) — отрицание точного равенства;
  • Строгие неравенства: <, >;
  • Нестрогие неравенства: <=, >= (то же что <math>\leqslant</math> и <math>\geqslant</math>; соответственно в математике);

Операция точного равенства используется в некоторых языках для сравнения значений операндов одновременно со сравнением типов этих значений, поскольку при сравнении некоторых значений разного типа обычная операция сравнения (==) может вернуть истину. Например, в языке PHP обычное сравнение между собой пустой строки (""), числа 0, пустого массива (array()) и булевого значения false даст результат истина.

В Си данные операции применимы только к скалярам, сравнение строк осуществляется отдельной функцией strcmp, возвращающей в зависимости от результата нулевое, отрицательное или положительное скалярное значение, реализуя таким образом трёхзначно-логическое отношение.

В отношении типов, не обладающих отношением порядка (например, структур) применимы только проверка равенства и неравенства.

Сравнение сложных объектов

Для составных объектов вроде записей в языках Паскаль и Си побитное сравнение может оказаться недостаточным. Часто блок памяти для таких типов данных может включать пустые участки, которые не имеют отношения к значениям, хранимым в объекте. Поскольку эти пропуски не должны учитываться при определении равенства, используется второй механизм, а именно поэлементное равенство. При поэлементном сравнении проверяются сопоставляемые элементы на совпадение, применяя это правило рекурсивно, пока не встретится элемент, отличный от записи. В последнем случае применяется побитное сравнение. Если все элементы удовлетворяют проверке, две записи рассматриваются как равные друг другу. Если какие-либо два элемента не совпадают, то записи не равны друг другу. Такое отношение равенства иногда называется структурной эквивалентностью.



en:Relational operator

de:Vergleichsoperator es:== fi:Vertailuoperaattori

Личные инструменты

Served in 0.121 secs.