Делал практический тест и наткнулся на это. Какое значение z? - PullRequest
0 голосов
/ 06 мая 2020
int z = 5, x = 44; 

switch (x) 
{ 
  case 45: 
    z = z + 15; 
    break; 

  case 46: 
    z = z - 5; 
    break;

  default: 
    z = z * 3; 
} 

1 Ответ

1 голос
/ 06 мая 2020
Операторы

Switch можно рассматривать как некоторые особые типы операторов If. С одной крошечной вещью. Если тела case не включают оператор break, тогда проверка регистра продолжается.

Что касается default case, он выполняется, когда никакие другие проверки case не верны.

Те, что говорят , ваш оператор switch может быть записан как:

if(x == 45)
{
  z = z + 15;
} else if(x == 46)
{
  z = z - 5;
} else 
{
  z = z * 3;
}

Очевидно, какое значение z будет при заданных значениях x и z 44 и 5.

И, тела case без операторов break это ifs без elses:

if(x == 45)
{
  z = z + 15;
}

if(x == 46)
{
  z = z - 5;
}

z = z * 3;

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

Для дальнейшего изучения рассмотрите этот код:

if(x == 44)
{
  z = z / 5;
  x = x + 1;
} else if(x == 45)
{
  z = z + 15;
  x = x + 1;
} else if(x == 46)
{
  z = z - 5;
  x = x + 1;
} else 
{
  z = z * 3;
}

и этот код

if(x == 44)
{
  z = z / 5;
  x = x + 1;
} 

if(x == 45)
{
  z = z + 15;
  x = x + 1;
}

if(x == 46)
{
  z = z - 5;
  x = x + 1;
}

z = z * 3;

с такими же заданными значениями x = 44 и z = 5. Как вы можете видеть, я фактически добавил оператор x = x + 1; к тому же switch on x с такими же case s и и новый случай, во всех where после назначения z, с break s и без него. В первом примере значение z равно 1, даже если значение x увеличивается до 45; но проверки остановились, потому что не попали в блок else. Но во втором примере все блоки поражены, и значение z будет равно 33.

...