﻿# V3155\. The expression is incorrect or it can be simplified\.

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

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

```cpp
var a = 11 - b + c * 1;
```

Переменная 'c' умножается на '1', что является избыточным\. Возможно, была допущена опечатка и вместо 1 должно быть написано, например 10:

```cpp
var a = 11 - b + c * 10;
```

Давайте теперь рассмотрим случай из реального проекта, когда избыточность была добавлена сознательно, но неудачно:

```cpp
detail.Discount = i * 1 / 4M;
```

Программист имел в виду, что переменная 'i' должна умножаться на значение одна четвёртая\. Да, можно было сразу написать 0\.25, но 1/4 лучше может передавать смысл алгоритма\.

Однако, получилось не очень удачно\. В начале выполняется умножение переменной 'i' на 1 и только затем происходит деление\. Да, результат получится один и тот же\. Но такой код может сбить с толку человека\. И по этой причине он не нравится и анализатору, который выдаст здесь предупреждение\.

Чтобы код стал более читаемым, а анализатор перестал выдавать предупреждение, лучше добавить скобки:

```cpp
detail.Discount = i * (1 / 4M);
```

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

```cpp
public virtual ValueBuffer GetIncludeValueBuffer(int queryIndex)
{
  return queryIndex == 0 
    ? _activeQueries[_activeIncludeQueryOffset + queryIndex].Current
    : _activeIncludeQueries[queryIndex - 1].Current;
}
```

В данном случае '\_activeIncludeQueryOffset' всегда будет складываться с нулем, так как выше находится проверка 'queryIndex \=\= 0'\. Скорее всего это не ошибка, но код можно упростить:

```cpp
public virtual ValueBuffer GetIncludeValueBuffer(int queryIndex)
{
    return queryIndex == 0 
    ? _activeQueries[_activeIncludeQueryOffset].Current
    : _activeIncludeQueries[queryIndex - 1].Current;
}
```

**Примечание\.** Анализатор не ругается на случаи, когда рядом с подозрительным выражением находится подобное ему выражение\. Пример:

```cpp
A[i+0]=1;
A[i+1]=10;
A[i+2]=100;
A[i+3]=1000;
A[i+4]=10000;
```

Выражение 'i \+ 0' является избыточным\. Но рядом располагаются подобные выражения вида 'i \+ литерал'\. Поэтому можно сделать вывод, что сложение с 0 было сделано сознательно, для соблюдения общего стиля написания\.