Должен ли я использовать оператор ++ для временных встроенных переменных? - PullRequest
2 голосов
/ 04 апреля 2020

Мне было интересно об этой преждевременной и не слишком важной вещи. Я написал:

m_playerIndex = ++m_playerIndex % 2 // always either 0 or 1 (int)

для моей шахматной игры, чтобы убедиться, что другой игрок сделает следующий ход после только что сделанного хода. Однако это не совсем читабельно, не так ли?

Кроме того, он увеличивает переменную на 1, а затем вызывает оператор модуля 2 для адаптированной переменной, что означает, что у меня есть временная переменная, которую я назначаю m_playerIndex и сразу после его замены результатом% 2. Что будет наиболее эффективным? Это вариант 2, 1 или разницы нет вообще? (У меня пока нет программ для проверки этих вещей.)

1)

m_playerIndex = ++m_playerIndex % 2

2)

m_playerIndex = (m_playerIndex + 1) % 2

Ответы [ 2 ]

7 голосов
/ 04 апреля 2020

Выражение

m_playerIndex = (m_playerIndex + 1) % 2

четко сообщает читателю, что происходит. Каждая возможная оптимизация здесь - это работа компилятора.

Кроме этого, для вашего любопытства, посмотрите https://godbolt.org/, где вы можете увидеть и сравнить инструкции ассемблера, созданные для вашего кода.

3 голосов
/ 04 апреля 2020

У вас больше проблем, чем с читабельностью или производительностью - поведение выражения не определено .

Вы пытаетесь обновить m_playerIndex более одного раза без промежуточной точки последовательности, через оба оператора ++ и =. Это не гарантирует, что вы делаете то, что ожидаете.

Чтобы выражение было четко определено, оно должно быть записано как

m_playerIndex = (m_playerIndex + 1) % 2;

Мне непонятно, почему вы думаете, что вы необходимо увеличить переменную в дополнение к этому, так как результат будет только 0 или 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...