﻿# V634\. Priority of '\+' operation is higher than priority of '<<' operation\. Consider using parentheses in the expression\.

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

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

```cpp
int X = 1<<4 + 2;
```

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

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

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

```cpp
int X = (1<<4) + 2;
```

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

Есть 3 варианта:

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

```cpp
int X = 1<<4 + 2; //-V634
```

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

```cpp
int X = 1<<(4 + 2);
```

3\) Можно уточнить ваши намерения, используя пробелы:

```cpp
int X = 1 << 4+2;
```

**Дополнительные ресурсы:**

1. Терминология\. [Приоритет операций в языке Си/Си\+\+](https://pvs-studio.ru/ru/blog/terms/0064/)\.