﻿# V6007\. Expression is always true/false\.

Анализатор выявляет некорректные условные выражения, которые при вычислении всегда являются истинными или ложными\.

**Случай 1\.**

Некорректно сформированное условие является всегда истинным или ложным\.

Подобные условия не всегда означают наличие ошибки, но эти фрагменты кода следует обязательно проверить\.

Пример некорректного кода:

```cpp
String str = ...;
if (!str.equals("#") || !str.isEmpty()){
    ...
} else {
    ...
}
```

Здесь ветка 'else' никогда не будет выполнена\.  Дело в том, что какое бы значение ни приняла переменная 'str', одно из сравнений со строкой всегда будет истинно\. Чтобы исправить эту ошибку, следует использовать оператор && вместо оператора \|\|\.

 Корректный вариант кода:

```cpp
String str = ...;
if (!str.equals("#") && !str.isEmpty()){
    ...
} else {
    ...
}
```

**Случай 2\.**

Два условных оператора, идущих последовательно, содержат взаимоисключающие условия\.

Примеры взаимоисключающих условий:

* "A \=\= B" и "A \!\= B";
* "A \> B" и "A <\= B";
* "A < B" и "B < A";
* и тому подобные\.

Такая ошибка может возникнуть в результате опечатки или неудачного рефакторинга\.

Пример некорректного кода:

```cpp
if (x == y)
  if (y != x)
    DoSomething(x, y);
```

В данном случае метод 'DoSomething' никогда не будет вызван, так как при истинности первого условия второе всегда будет ложным\. Возможно, в сравнении используется некорректная переменная\. Например, во втором условии следовало использовать не 'x', а 'z':

```cpp
if (x == y)
  if (y != z)
    DoSomething(x, y);
```

**Случай 3\.**

В выражении ищется более длинная подстрока и более короткая\. При этом, более короткая строка является частью более длинной\. Получается, что одно из сравнений избыточно или содержит какую\-нибудь ошибку\.

Рассмотрим пример:

```cpp
if (str.contains("abc") || str.contains("abcd"))
```

В случае, если подстрока "abc" будет найдена, то дальнейшая проверка не будет выполняться\. Если подстрока "abc" не будет найдена, то и поиск более длинной подстроки "abcd" не имеет смысла\.

Для исправления ошибки необходимо проверить правильность подстрок или убрать из кода лишние проверки\.  Пример корректного варианта:

```cpp
if (str.contains("abc"))
```

Другой пример:

```cpp
if (str.contains("abc"))
  Foo1();
else if (str.contains("abcd"))
  Foo2();
```

В данном случае метод 'Foo2' никогда не будет вызван\. Устранить ошибку можно путем замены порядка проверки\. То есть сначала следует искать более длинную подстроку, а потом более короткую:

```cpp
if (str.contains("abcd"))
  Foo2();
else if (str.contains("abc"))
  Foo1();
```