﻿# V686\. Pattern A \|\| \(A && \.\.\.\) was detected\. The expression is excessive or contains a logical error\.

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

Пример подозрительного кода:

```cpp
int k,n,j;
...
if (n || (n && j))
```

Это выражение избыточное\. Если "n\=\=0", то условие всегда ложно\. Если "n\!\=0", то условие всегда истинно\. Таким образом, условие не зависит от значения переменной 'j' и его можно упростить:

```cpp
if (n)
```

Иногда, избыточность означает наличие опечатки\. Вдруг, например, на самом деле, условие должно быть таким:

```cpp
if (k || (n && j))
```

Рассмотрим более реальный пример, благодаря которому и появилась эта диагностика:

```cpp
const char *Name = ....;
if (Name || (Name && Name[0] == 0))
```

Здесь сразу есть и ошибка и избыточность\. Условие должно выполняться, если строка, на которую ссылается указатель 'Name', пустая\. Пустая строка может обозначаться нулевым указателем\.

Из\-за ошибки условие выполнится всегда, если Name \!\= nullptr\. Исправленный код:

```cpp
if (!Name || (Name && Name[0] == 0))
```

Теперь ошибки нет\. Но дополнительно можно сократить количество проверок:

```cpp
if (!Name || Name[0] == 0)
```