﻿# V1104\. Priority of the 'M' operator is higher than that of the 'N' operator\. Possible missing parentheses\.

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

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

```cpp
unsigned char foo(unsigned char byte2, unsigned char disp)
{
  disp |= byte2 & 0b10000000 >> 6;
  return disp;
}
```

Согласно правилам [приоритета операций](https://pvs-studio.ru/ru/blog/terms/0064/) в языках C и C\+\+, выражение будет вычисляться следующим образом:

```cpp
( disp |= ( byte2 & ( 0b10000000 >> 6 ) ) )
```

Побитовый сдвиг вправо маски '0b10000000' в этом случае выглядит подозрительно\. Скорее всего, программист ожидал, что результат побитового "И" будет сдвинут на 6\.

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

```cpp
unsigned char f(unsigned char byte2, unsigned char disp)
{
  disp |= (byte2 & 0b10000000) >> 6;
  return disp;
}
```

**Общая рекомендация**: если в сложном выражении не понятен приоритет операций, то лучше обернуть часть выражения в скобки \([CERT EXP00\-C](https://wiki.sei.cmu.edu/confluence/display/c/EXP00-C.+Use+parentheses+for+precedence+of+operation), [ES\.41 CppCoreGuidelines](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-parens)\)\. Даже если скобки окажутся лишними, это нестрашно\. Код станет более простым для понимания и будет меньше подвержен ошибкам\.

Если вы считаете, что срабатывание ложное, то можно либо подавить его при помощи комментария '//\-V1104', либо обернуть в скобки выражение**:**

```cpp
// first option
disp |= byte2 & 0b10000000 >> 6; //-V1104
// second option
disp |= byte2 & (0b10000000 >> 6);
```