﻿# V709\. Suspicious comparison found: 'a \=\= b \=\= c'\. Remember that 'a \=\= b \=\= c' is not equal to 'a \=\= b && b \=\= c'\.

В коде обнаружено логическое выражение вида a \=\= b \=\= c\. К сожалению, иногда программисты забывают, что правила языков С и С\+\+ не совпадают с правилами, принятыми в математике \(и на первый взгляд – со здравым смыслом\) и таким сравнением можно проверить равенство трёх переменных\. Однако на самом деле вместо проверки на равенство будет вычислено несколько не то, что хотелось\.

Разберём пример\.

```cpp
if (a == b == c) ....
```

Предположим, что a \=\= 2, b \=\= 2 и c \=\= 2\. Первое сравнение \(a \=\= b\) окажется истинным, поскольку 2 \=\= 2\. В результате данное сравнение возвращает значение true \(1\)\. Второе же сравнение \(\.\.\. \= c\) вернёт уже значение false, поскольку true \!\= 2\. Для того, чтобы сравнение трёх \(и более\) переменных давало корректный результат, следует воспользоваться следующим выражением:

```cpp
if (a == b && b == c) ....
```

В данном случае действительно a \=\= b вернёт true, b \=\= c вернёт true, и результат логической операции AND будет также равен true\.

Однако часто выражения, подобные ошибочным, пишутся для сокращения количества кода\. Анализатор не выдаст предупреждение в случаях, если:

1\) Третья переменная имеет тип bool, BOOL и т\.п\. или сама по себе равна 0, 1, true или false\. В этом случае ошибка крайне маловероятна – скорее всего, программист написал правильный код:

```cpp
bool compare(int a, int b, bool res)
{
  return a == b == res;
}
```

2\) В выражении присутствуют скобки\. В этом случае очевидно, что программист понимает логику и хочет, чтобы выражение выполнялось именно так, как написано:

```cpp
if ((a == b) == c) ....
```

В случае, если анализатор выдал ложное срабатывание V709, рекомендуемым путём его устранения является добавление скобок как в примере выше\. Это позволить указать другим программистам, что код корректен\.