﻿# V771\. The '?:' operator uses constants from different enums\.

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

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

```cpp
enum OnlyOdd { Not_Odd, Odd };
enum OnlyEven { Not_Even, Even };

int isEven(int a)
{
  return (a % 2) == 0 ? Even : Odd;
}
```

Функция проверяет число на четность, но в возвращающемся значении используются константы из двух разных перечислений \(OnlyEven::Even и OnlyOdd::Odd\), приводимые к типу 'int'\. В результате, независимо от переданного аргумента 'a', функция всегда будет возвращать 1 \(истину\)\. Корректный код должен выглядеть следующим образом:

```cpp
enum OnlyOdd { Not_Odd, Odd };
enum OnlyEven { Not_Even, Even };

int isEven(int a)
{
  return (a % 2) == 0 ? Even : Not_Even;
}
```

Примечание\. Нормальной ситуацией считается применение двух разных перечислений без имени, например:

```cpp
enum 
{
  FLAG_FIRST = 0x01 << 0,
  FLAG_SECOND = 0x01 << 1,
  ....
};

enum 
{
  FLAG_RW = FLAG_FIRST | FLAG_SECOND,
  ....
};

....
bool condition = ...;
int foo = condition ? FLAG_SECOND : FLAG_RW; // нет V771
....
```