﻿# V3177\. Logical literal belongs to second operator with a higher priority\. It is possible literal was intended to belong to '??' operator instead\.

Анализатор обнаружил фрагмент кода, который, возможно, содержит логическую ошибку\. В условном выражении логический литерал находится между '??' и другим оператором с более высоким приоритетом\.

Оператор '??' имеет приоритет ниже, чем операторы '\|\|', '&&', '\|', '^', '&', '\!\=', '\=\='\. В случае отсутствия скобок, определяющих порядок проверки условия, может возникнуть ошибка, подобная приведенной ниже:

```cpp
class Item
{
  ....
  public bool flag;
  ....
}

void CheckItem(Item? item)
{
  if (item?.flag ?? true || GetNextCheck(item))
  {
    ....
  }
  return;
}
```

Так как приоритет оператора '??' ниже чем '\|\|', в первую очередь будет выполнена проверка выражения 'true \|\| GetNextCheck\(\)', которая всегда возвращает 'true', при этом метод 'GetNextCheck' никак не влияет на полученный результат\. 

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

```cpp
class Item
{
  ....
  public bool flag;
  ....
}

void CheckItem(Item? item)
{
  if ((item?.flag ?? true) || GetNextCheck(item))
  {
    ....
  }
  return;
}
```

В исправленном варианте условия сначала выполнится выражение 'item?\.flag ?? true', и только потом отработает оператор '\|\|'\.