C++, стрелка вверх определена как вверх, так и вправо

Я определил четыре клавиши со стрелками как таковые

#define UP_ARROW    72
#define LEFT_ARROW  75
#define DOWN_ARROW  80
#define RIGHT_ARROW 77

И ключи проверяются с помощью _getch(), как таковой

char key = _getch();
if (key == 0 || key == -32)
{
    key = _getch();
    switch (key)
    {
    case UP_ARROW:
        //These are functions not relevant to the problem
        //up(1);
    case DOWN_ARROW:
        //down(1);
    case LEFT_ARROW:
        //left(1);
    case RIGHT_ARROW:
        //right(1);

        //Pressing up will print out "test", which should not happen
        printf("test");
    }
}

Как прокомментировано, нажатие вверх вызовет что-либо в случае RIGHT_ARROW. Я сделал что-то неправильно?

3 ответа

Решение

Тебе необходимо break; заявление, чтобы остановить продолжение выключателя.

Вы можете использовать оператор break, чтобы завершить обработку конкретного случая в операторе switch и перейти к концу оператора switch. Без перерыва программа переходит к следующему случаю, выполняя операторы до тех пор, пока не будет достигнут разрыв или конец оператора. В некоторых ситуациях это продолжение может быть желательным.

http://msdn.microsoft.com/en-us/library/66k51h7a.aspx

Без break, case statements runs all through:

case UP_ARROW:
    //up(1);
    break;     //here
case DOWN_ARROW:
    //down(1);
    break;     //and here

Я использовал это один раз, как:-

#include <stdio.h>
#include <conio.h>

#define KB_UP 72
#define KB_DOWN 80
#define KB_LEFT 75
#define KB_RIGHT 77
#define KB_ESCAPE 27


int main()
{
   int KB_code=0;

   while(KB_code != KB_ESCAPE )
   { 
     if (kbhit())
      {
            KB_code = getch();
            printf("KB_code = %i \n",KB_code);

            switch (KB_code)
            {
                case KB_LEFT:
                           //Do something
                break;

                case KB_RIGHT:
                           //Do something                     
                break;

                case KB_UP:
                           //Do something                     
                break;

                case KB_DOWN:
                           //Do something                     
                break;

            }        

      }
  }

  return 0;
}
Другие вопросы по тегам