Операция предварительного увеличения в C
Я только начинаю руководство для начинающих по обучению программированию игр на C. Я немного запутался с приведенным ниже кодом.
В основном gameOverTick установлен на ноль, тогда у нас есть случай, когда игра окончена
case GAME_OVER:
printStatus("GAME OVER!!! The evil DarkLord was defeated");
if (++gameOverTick % 100 == 0){
status = PRINT_GAME_WELCOMESCREEN; // go back to welcome screen
gameOverTick = 0; // reset gameOverTick
}
Я просто хотел бы знать, какую роль выполняет операция ++ (pre-inc) в gameOverTick. Устанавливает ли он для gameOverTick значение 1 при проверке if, или как-то устанавливает для него значение 0. Я знаю, как работает post-inC++, но для меня это новый.
Спасибо
4 ответа
Код, который вы написали в круглых скобках if, называется выражением, вычисление выражения всегда следует правилу приоритета оператора, учитывая данное выражение
Оператор 1.++ имеет наивысший приоритет, поэтому "++gameOverTick" сначала оценивается как "(gameOverTick = gameOverTick+1)"
2. Следующий следующий приоритет - для оператора "%", поэтому рассчитывается "(gameOverTick+1)%100".
3.Наконец оператор наименьшего приоритета равен '==', поэтому полученный результат в левой части оператора '==' сравнивается на равенство со значением в правой части.
Пример:
-Посмотрите значение gameOverTick как 99
-99 увеличивается первым, т. Е. 99 + 1 = 100
-Тогда операция% выполняется, т.е. 100% 100 = 0
- Теперь сравнивается равенство, т. Е. 0 == 0, что дает 1
-Оценка выражения дает 1, следовательно, оно равно if(1), что указывает на истинное значение.
Для получения дополнительной информации о приоритетах операторов вы можете обратиться по этой ссылке http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm
У нас здесь четыре ответа, и все они одинаковы. Позвольте мне убедиться, что это очень ясно в вашем уме: люди, которые говорят вам, что приоритет операторов определяет порядок, в котором побочные эффекты возникают в результате вычисления подвыражений, просто неверны. В C порядок, в котором вычисляются подвыражения, не контролируется приоритетом; это в значительной степени не определено. (В C# и Java это определяется не как порядок приоритета, а слева направо.)
В конкретном случае здесь значение ++
операция должна быть вычислена до %
случается, но назначение, связанное с ++
операция может произойти в любое время. В вашем конкретном случае не имеет значения, когда происходит назначение, но легко построить случаи, когда это имеет значение.
Это увеличивает gameOverTick на единицу до того, как вычисляется модуль и выполняется сравнение. (Хорошее эмпирическое правило в C состоит в том, что унитарные операции имеют более жесткую привязку, чем двоичные, и вычисления по логическим операциям.) Предполагается, что цель этого состоит в том, чтобы подождать 100 циклов, пока он не взломает экран приветствия, поскольку gameOverTick только сбрасывается если бы дошло до 100.
Большинство выражений в C имеют значение; У большинства выражений есть побочный эффект.
Рассмотрим два выражения ниже
/* a */ i++
/* b */ ++i
Побочным эффектом обоих выражений является увеличение значения i
(это изменение применимо только после следующей точки последовательности). Значение первого выражения является значением i
имел на предыдущей точке последовательности; значение второго выражения на единицу больше чем i
имел в предыдущей точке последовательности.