2013-09-22 2 views
0

Я написал кусок кода, который не похоже на работу в соответствии с требованиями:Я правильно сравниваю значения enum с оператором или оператором C++?

typedef enum{none=0,apple,grape,orange} FRUIT; 

FRUIT first = rand()%4; 
FRUIT second = rand()%4; 
FRUIT third = rand()%4; 

Так что в моем состоянии, если, я могу иметь

if (first == (none | apple | grape | orange) && 
    second == apple && 
    third == (none | apple | grape | orange) 
{ 
    cout<<"Here"<<<endl; 
} 

Переменные first и third может иметь любой от яблоко, виноград, нет или оранжевый значения. Правильно ли условие if? Я не получаю желаемый результат, так как он вообще не входит в условие if.

+4

'а == (б | в)' не то же самое, как '(A == B) || (a == c) ', что вы, вероятно, хотели. На это, вероятно, есть несколько сотен вопросов;). – us2012

+4

[Не используйте 'rand'. Это отстой.] (Http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful) И особенно не используйте модуль. – chris

+1

@chris Конечно, это хорошая идея, чтобы узнать о хороших случайных числах раньше, но на самом деле, для сбора фруктов это не имеет значения ... – us2012

ответ

3

В состоянии:

first == (none | apple | grape | orange) 

вы должны использовать логическое или (||) вместо побитового или (|). К сожалению, даже если вы изменили его:

first == (none || apple || grape || orange) 

правая часть этого условия будет оцениваться первым, что делает его (в данном случае), что эквивалентно:

first == true 

, которая до сих пор семантически отличается от того вероятно, имел в виду:

first == none || first == apple || first == grape || first == orange 

отметить также, что использование rand() не очень мудрая здесь. Вы можете попробовать использовать вместо std::random_shuffle:

FRUIT fruit[] = { none, apple, grape, orange, 
        none, apple, grape, orange, 
        none, apple, grape, orange}; 
srand(time(NULL)); 
std::random_shuffle(&fruit[0], &fruit[11]); 
FRUIT first = fruit[0]; 
FRUIT second = fruit[1]; 
FRUIT third = fruit[2]; 

просто не забудьте #include <algorithm> :)

+1

Использование || вместо | не имеет к этому никакого отношения. – EJP

+0

@EJP: Если вы используете 'rand()' то, что вы имели в виду, я отредактировал свой ответ. – LihO

+1

Попробуйте прочитать то, что я на самом деле написал. Я не упоминал rand(). Я не вижу ничего непонятного в том, что я написал. Первые шесть строк вашего ответа совершенно неактуальны, т. Е. Все до «вы, вероятно, имели в виду». Часть, которую вы по какой-то причине добавили о rand(), также не имеет значения. – EJP

0

Могу ли я сравнивать значения перечислений с оператором С ++ „или“ правильно?

Нет, вы должны написать:

first == none || first == apple || first == grape || first == orange 
Смежные вопросы