Skip to content

Latest commit

 

History

History
105 lines (76 loc) · 5.54 KB

Операции-сравнения.mediawiki

File metadata and controls

105 lines (76 loc) · 5.54 KB

Операции сравнения – это бинарные операции, т.е. у них два аргумента.

Знаки операций сравнения такие:

знак операции в языке Си название математическое обозначение
== равно =
!= не равно
< меньше <
<= меньше либо равно
> больше >
>= больше либо равно

Achtung!!!
В языке Си нет операций, которые записываются как:

  =>
  =<
  <>
  ><

Achtung!!!
Между символами, с помощью которых записываются знаки операций, вставлять пробелы нельзя!

Правильно:

  a == b

Тоже правильно, но хуже читается:

  a==b

Неправильно (синтаксическая ошибка):

  a = = b

Операции == и =

Achtung!!!
По невнимательности очень легко вместо проверки на равенство (==) написать операцию присваивания (=). Самое печальное, что операция присваивания – это тоже операция, т.е. то, что мы записываем с ее момощью – это тоже совершенно корректное выражение, как и выражение, записанное с помощью операции сравнения. Но смысл операции присваивания и операции сравнения совсем разный! В результате, если мы случайно напишем:

    if (x=1) {
        y = -222;
    } else {
        y = 777;
    }

вместо:

    if (x==1) {
        y = -222;
    } else {
        y = 777;
    }

То с точки зрения правил записи (и с точки зрения компилятора, хотя многие компиляторы на всякий случай выдадут тут предупреждение (warning)) ошибки не будет. Но в результате программа вместо сравнения x c 1 будет записывать значение 1 в переменную x и использовать записанное значение (т.е. 1) как результат проверки условия, которое, таким образом, будет всегда истинным.

Использование нескольких сравнений в одном условии

Результатом операции сравнения является логическое значение в понимании языка Си, то есть 0 ("ложь") или 1 ("истина").

Если необходимо как-то учесть результат нескольких сравнений в одном условии, то пытаться это сделать, записав через запятую — неверно, например:

  if (x > 1, y > 2) {
     . . .
  }

Самое обидное, что компилятор в этом случае не сообщит об ошибке, так как формально синтаксически такая запись имеет право на существование, так как в языке Си есть операция "запятая", которая означает последовательное вычисление выражений, при этом результатом операции считается значение последнего выражения (в целом эту операцию лучше не использовать, за исключением некоторых случаев). Таким образом, в приведённом примере учитываться будет только сравнение y > 2.

Чтобы использовать результат нескольких сравнений в одном условии, необходимо использовать какую-то из бинарных логических операций языка Си — см. Логические операции.

Если необходимо одновременное выполнение двух условий, нужно использовать операцию && (логическое "и"), например:

  if (x > 1 && y > 2) {
     . . .
  }

Если достаточно выполнения хотя бы одного из условий, нужно использовать операцию || (логическое "или"), например:

  if (x > 1 || y > 2) {
     . . .
  }

Последовательное использование нескольких операций сравнения, хотя и правильно синтаксически, даёт, как правило, не тот результат, который ожидается. Например, условие:

  20 < x < 30

эквивалентно

  (20 < x) < 30

То есть со значением 30 сравнивается значение 0 или 1, получившееся в результате сравнения 20 < x. Условие, соответствующее математической записи 20 < x < 30 на языке Си можно записать как:

  20 < x && x < 30