﻿# V648\. Priority of '&&' operation is higher than priority of '\|\|' operation\.

Анализатор обнаружил потенциальную ошибку, связанную с тем, что приоритет логической операций '&&' выше приоритета логической операции '\|\|'\. Про это часто забывают\. В результате логическое выражение может давать совсем не тот результат, на который рассчитывал программист\.

Рассмотрим пример некорректного кода:

```cpp
if ( c == 'l' || c == 'L' &&
    !( token->subtype & TT_LONG ) )
{ .... }
```



Скорее всего, программист ожидал, что вначале выполнится проверка равенства переменной 'c' значению 'l' или 'L'\. И только затем выполнится операция '&&'\. Но согласно [приоритету операций в языке Си/Си\+\+](https://pvs-studio.ru/ru/blog/terms/0064/) вначале произойдет выполнение операции '&&', а уже потом '\|\|'\. 

Можно порекомендовать во всех выражениях с редко используемыми вами операторами или там где нет уверенности, писать скобки\. Даже если скобки окажутся лишними, это не страшно\. Зато код станет более легким для понимания и будет меньше подвержен ошибкам\.

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

```cpp
if ( ( c == 'l' || c == 'L' ) &&
    !( token->subtype & TT_LONG ) )
```



А как убрать ложное предупреждение, если действительно планировалась последовательность вычислений: сначала логическое '&&', затем логическое '\|\|'?

Есть несколько вариантов:

1\) Плохой вариант\. Можно использовать комментарий "//\-V648" для подавления предупреждения в нужной строке\. 

```cpp
if ( c == 'l' || c == 'L' && //-V648
    !( token->subtype & TT_LONG ) )
```

2\) Хороший вариант\. Можно добавить дополнительные скобки:

```cpp
if ( c == 'l' || ( c == 'L' &&
    !( token->subtype & TT_LONG ) ) )
```

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