Мне нужна помощь в понимании того, что выполняет синтаксис этого конкретного оператора if

#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 значение of 4 , то оператор 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. Отличный пример, мой друг, спасибо, что прояснил мою голову. Я действительно ценю ваше время, помогая мне. Я посмотрю на ваш пример в следующий раз, когда сяду за работу. Еще раз спасибо.