﻿# V3001\. There are identical sub\-expressions to the left and to the right of the 'foo' operator\.

Анализатор обнаружил фрагмент кода, который, скорее всего, содержит логическую ошибку\. В тексте программы имеется оператор \(<, \>, <\=, \>\=, \=\=, \!\=, &&, \|\|, \-, /, &, \|, ^\), слева и справа от которого расположены одинаковые подвыражения\. 

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

```cpp
if (a.x != 0 && a.x != 0)
```

В данном случае оператор '&&' окружен одинаковыми подвыражениями "a\.x \!\= 0", что позволяет обнаружить ошибку, допущенную по невнимательности\. Корректный код, который не вызовет подозрений у анализатора, будет выгладить так:

```cpp
if (a.x != 0 && a.y != 0)
```

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

```cpp
class Foo {
  List<int> Childs { get; set; }
  ...
  public bool hasChilds() { return(Childs[0] > 0 || Childs[0] > 0); }
  ...
}
```

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

```cpp
public bool hasChilds(){ return(Childs[0] > 0 || Childs[1] > 0);}
```

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

```cpp
if (Name.Length > maxLength && maxLength < Name.Length)
```