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

The analyzer detected a possible error that has to do with the ternary operator '?:' using constants from different enumerations as its second and third operands\.

Consider the following example:

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

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

This function checks if the number passed as an argument is even, but its return value is evaluated using constants from two different enums \(OnlyEven::Even and OnlyOdd::Odd\) cast to 'int'\. This mistake will cause the function to return 1 \(true\) all the time regardless of the 'a' argument's actual value\. This is what the fixed code should look like:

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

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

Note\. Using two different unnamed enumerations is considered a normal practice, for example:

```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; // no V771
....
```