﻿# V564\. The '&' or '\|' operator is applied to bool type value\. Check for missing parentheses or use the '&&' or '\|\|' operator\.

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

Рассмотрим пример:

```cpp
int a, b;
#define FLAG 0x40
...
if (a & FLAG == b)
{
}
```

Этот пример считается классическим\. Очень легко ошибиться в приоритетах операций\. Кажется, что последовательность вычислений следующая \- "\(a & FLAG\) \=\= b"\. Но на самом деле, последовательность вычислений будет следующая \- "a & \(FLAG \=\= b\)"\. И скорее всего, это ошибка\.

Анализатор выдаст здесь предупреждение, так как странно использовать оператор '&' для переменных типа int и bool\.

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

```cpp
if ((a & FLAG) == b)
```

Конечно, код может оказаться корректным и работать именно так, как нужно\. Однако и в этом случае рационально переписать его, чтобы он стал проще для понимания\. Лучше использовать оператор && или дополнительные скобки:

```cpp
if (a && FLAG == b)
if (a & (FLAG == b))
```

После таких исправлений предупреждение V564 более выдаваться не будет, а код станет более прост для чтения\.

Рассмотрим другой пример:

```cpp
#define SVF_CASTAI 0x00000010
if ( !ent->r.svFlags & SVF_CASTAI ) {
  ...
}
```

Здесь мы имеем дело с явной ошибкой\. В начале будет вычислено подвыражение "\!ent\-\>r\.svFlags" и получен результат true или fasle\. Но это не имеет значения\. Будем мы выполнять операцию "true & 0x00000010" или "false & 0x00000010", результат будет одинаков\. Условие в данном примере всегда ложно\.

Исправленный вариант:

```cpp
if ( ! (ent->r.svFlags & SVF_CASTAI) )
```



Примечание\. Анализатор не будет выдавать предупреждение, если слава и справа от оператора '&' или '\|' находятся значения типа bool\. Такой код хотя и не очень красив, но корректен\. Пример кода, который анализатор считает безопасным:

```cpp
bool X, Y;
...
if (X | Y)
{ ... }
```