2014-10-28 5 views
0

В C++, кто-то написали следующее:Modulo в условном тройном операторе

player = (player % 2) ? 1 : 2; 

Из того, что я прочитал, переменная «игрок» оценит 1, если условие внутри скобок верно, но это не похоже на условие, которое может быть истинным или ложным.

+0

Неявные преобразования. Это ужасный код, но, к сожалению, довольно распространенный. Условие * должно быть записано как 'player% 2 == 1'. –

ответ

3

Если player является int или имеет в неявном преобразовании в int, то операция по модулю будет либо вернуть 0 или 1 в этом случае для четных или нечетных соответственно.

Оттуда int имеет неявное преобразование в bool таким образом, что 0 оценивает, чтобы false и все ненулевые значения (включая отрицательные значения) оценки для true.

Пример
Начиная с

player = 2; 

Мы можем следовать тройную выражение шаг за шагом

player = (player % 2) ? 1 : 2; 
player = (2 % 2) ? 1 : 2; 
player = 0 ? 1 : 2; // 0 evaluates to false 
player = 2; 

Однако, я думаю, что эта логика ошибочна, они, вероятно, имел в виду

player = (player % 2) ? 2 : 1; 

Это действительно «переключит» игроков чередующимся образом, то есть когда player изначально 1, после тройного будет назначено 2 и наоборот.

Смежные вопросы