#c #if-statement #syntax
#c #if-statement #синтаксис
Вопрос:
Я пытаюсь следовать и разбить исходный код для клона pacman. Существует оператор if, который меня смущает.
void PacMan::queueDirection(Direction dir)
{
if (!directions.empty())
{
if (dir == -directions.front()) //this statement
{
std::queue<Direction> clear;
std::swap(directions, clear);
}
}
if(directions.size() < 2)
directions.push(dir);
}
Мой вопрос в том, что делает — infront of -directions .что делает front()? направления — это очередь. Умножает ли он ссылку, возвращаемую front() на -1?
Спасибо за помощь — я опубликую ссылку ниже на github, где находится весь проект.
https://github.com/HexagonNico/Pac-Man/blob/master/PacMan.cpp если это пощекочет вашу фантазию.
Комментарии:
1. Умножает ли он ссылку, возвращаемую front(), на -1? По сути, хотя большинство людей сказали бы, что это просто отрицает значение, возвращаемое
front()
.2.
-
это вычитание, а не умножение. В этом случае он отрицает значение, возвращаемоеdirections.front()
, то есть меняет знак на противоположный тому, что было.3. Это оператор
unary minus
(или отрицание). Вы можете найти его описание на этой странице cppreference .4.
front()
возвращает ссылку на первый объект, хранящийся в очереди. Что касается этого кода, он работает с первым объектом в очереди. Если, например,front()
возвращаетint
значение of4
, то оператор if сравниваетсяdir
с-4
.5. @KenWhite:
-
не является ни вычитанием, ни умножением. Это просто символ. Больше ничего. То, что он часто используется для вычитания , не означает, что это вычитание. В данном случае это отрицание . как вы правильно сказали, но это не имеет никакого отношения к вычитанию .
Ответ №1:
Вставленный вами код, по-видимому, имеет следующую цель:
в случае, если экземпляр Direction во главе очереди, directions , является отрицательным значением, указанным в качестве аргумента этой функции, очередь очищается, а предоставленный аргумент ставится в очередь.
Направление типа в этом случае является перечислением, как определено в заголовке Directions.h
enum Direction
{
Up = 1,
Down = -1,
Left = 2,
Right = -2,
Unset = 0
};
Отрицание экземпляра Direction в этом случае просто дает нам его диаметральную противоположность.
В качестве примера рассмотрим, что значение Direction::Up находится во главе очереди во время вызова функции, а аргументом функции является Direction::Down . В этом случае направления очереди будут очищены. Я добавил пример, чтобы прояснить этот момент.
Комментарии:
1. Отличный пример, мой друг, спасибо, что прояснил мою голову. Я действительно ценю ваше время, помогая мне. Я посмотрю на ваш пример в следующий раз, когда сяду за работу. Еще раз спасибо.