﻿# V732\. Unary minus operator does not modify a bool type value\.

Анализатор обнаружил, что операция унарного минуса применяется к значению типа bool, BOOL, \_Bool, и т\.п\. 

Пример ошибки:

```cpp
bool a;
....
bool b = -a;
```

Этот код не имеет смысла\.  Вычисление происходит следующим образом:

Если a \=\= false, тогда 'false' превращается в значение типа int, равное 0\. К этому значению применяется оператор '\-'\. На значение это, естественно, не влияет и в 'b' будет записано 0 \(т\.е\. false\)\.

Если a \=\= true, тогда 'true' превращается в значение типа int, равное 1\. К этому значению применяется оператор '\-' и получается значение \-1\. Однако, \-1 \!\= 0, а значит при записи \-1 в переменную типа bool мы вновь получим 'true'\.

Таким образом значение 'false' останется 'false', а 'true' останется 'true'\. 

В корректном присваивании должен использоваться оператор '\!':

```cpp
bool a;
....
bool b = !a;
```

Другой пример \(BOOL есть не что иное как тип int\):

```cpp
BOOL a;
....
BOOL b = -a;
```

Унарный минус может изменить численное значение переменной типа BOOL, но не её логическое значение\. Всякое ненулевое значение будет обозначать истину, а ноль так и останется ложью\.

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

```cpp
BOOL a;
....
BOOL b = !a;
```

Примечание\. Некоторые программисты могут умышленно использовать конструкции следующего вида:

```cpp
int val = Foo(); 
int s; 
s = -(val<0);
```

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

В зависимости от значения 'val' переменной "s" хотят присвоить либо 0, либо \-1\. Применение унарного минуса к логическому выражению только усложняет чтение кода\. Более подходящим будет использование тернарного оператора\.

```cpp
s = (val < 0) ? -1 : 0;
```