2013-08-23 2 views
0

Вопрос с несколькими вариантами: что является результатом следующего кода?Почему этот оператор switch возвращает ZeroHello World вместо Zero?

int x=0; 
switch(x) 
{ 
    case 1: printf("One"); 
    case 0: printf("Zero"); 
    case 2: printf("Hello World"); 
} 

Варианты:

  1. One
  2. Zero
  3. Hello World
  4. ZeroHello World

Я предполагал, что это будет возвращать только Zero. Я играл с тем, что значение int, и оно изменило выход, но я не могу следить за тем, что здесь происходит.

+0

«Я предполагал, что он вернется только к нулю». -- Зачем? Предположения не заменяют изучение и изучение по крайней мере * основ * языка программирования. (Кроме того, ничего не возвращается.) Пожалуйста, прочтите следующее: http://meta.stackexchange.com/questions/182266/how-much-research-effort-is-expected-of-stack-overflow-users/ –

ответ

6

Это 4, ZeroHelloWorld. Это потому, что вы не используете перерыв. Случается, что ваш код (правильно) попадает в регистр 0 и выполняет этот код. Но затем происходит то, что происходит (отсюда Hello World). Чтобы этого не произошло, вам необходимо использовать оператор break, например:

int x=0; 

switch(x){ 
case 1: 
    printf("One"); 
    break; 

case 0: 
    printf("Zero"); 
    break; 

case 2: 
    printf("Hello World"); 
    break; 
} 

И это на самом деле скажет только ноль.

Вы можете увидеть вашу проблему более четко, если установить x в 1. Затем вы распечатаете OneZeroHello World.

+0

Спасибо, я не признал, что перерывов не было –

2

В случаях, когда «заявления» о случаях «проваливаются», то есть оператор case начинает выполнение первого истинного условия и продолжает использовать конец оператора case или «выход».

Вам необходимо явно выйти так.

int x=0; 
    switch(x) 
    { 
    case 1: printf("One"); 
      break; 
    case 0: printf("Zero"); 
      break; 
    case 2: printf("Hello World"); 
    } 
2

case метка определяет только в какой момент в коммутаторе начинается выполнение кода. После ввода коммутатора, если не существует break, выполнение кода будет «проходить» и продолжить выполнение.

Таким образом, переключатель вводится по адресу case 0:, а Zero будет напечатан. Поскольку нет никакого break, следующий оператор выполняется, так и ваш выход будет ZeroHello World

Если вы хотите только Zero как выход, вам необходимо:

int x=0; 
switch(x) 
{ 
     case 1: printf("One"); 
     break; // note the "break" 
     case 0: printf("Zero"); 
     break;   
     case 2: printf("Hello World"); 
     break; 
} 

break вызовет исполнение, чтобы остановить после printf("Zero"); и выйдет из коммутатора.

4

Просто уточняйте предыдущие ответы.

В C (и других его вариантах) в качестве ярлыков используются случаи в операторах switch. Основываясь на значении x, он перейдет к правильному аргументу case, но затем он будет проходить через все остальные утверждения case ниже, если только вы не имеете оператор break.

Кроме этого, полезно также использовать значение по умолчанию в конце, так что, если значение X является чем-то отличным от 0,1 или 2, поведение по-прежнему предсказуемо.Я предполагаю, что это означает, что ваш код должен выглядеть,

int x=0; 
switch(x) 
{ 
    case 1: printf("One"); 
      break; 
    case 0: printf("Zero"); 
      break; 
    case 2: printf("Hello World"); 
      break; 

    default: printf("X is out of range, it was %d\n", x); 
} 

Вам не нужно заявление перерыв для умолчанию, так как он является последним в любом случае.

Посмотрите, here для синтаксиса.

Надеется, что это помогает,

1

результата 4. Собственно х переключателю (х) просто указует на «стартовую точку» исполнения. Вам нужно «сломать», чтобы прервать выполнение. Таким образом, без перерыва коммутатор начнет выполнять инструкции из case x, пока не выполнит все следующие случаи.

Смежные вопросы