Почему мы не можем определить переменную дважды в коммутаторе?
Почему это незаконно:
switch(x) {
case 1:
int a = 1;
break;
case 2:
int a = 2;
break;
}
Похоже, это могло быть законным. Каковы некоторые более глубокие причины для того, чтобы это было незаконным?
Ответы
Ответ 1
если инструкции break не используются, тогда мы знаем, что будут выполняться следующие случаи. Поэтому, если вам разрешено объявлять в обоих случаях, что вызовет конфликт. Например
switch(x) {
case 1:
int a = 1; // i have removed the break;
case 2:
int a = 2; // now what will happen here :)
break;
}
Ответ 2
Поскольку область ограничена {
и }
, и у вас есть переменная a
дважды.
Вы можете избежать этой ошибки компиляции:
switch(x) {
case 1: {
int a = 1;
break;
}
case 2: {
int a = 2;
break;
}
}
Обратите внимание, что в вашем примере компилятор не удался, потому что если вы удалите первый оператор break
, то, что называется fall-through может случиться:
Все утверждения после метки совпадения выполняются в последовательности, независимо от выражения последующих меток case, до тех пор, пока не будет встречен оператор break.
В этом случае утверждения, которые будут выполняться (из-за провала), следующие:
-
int a = 1;
-
int a = 1;
-
break;
И как вы можете видеть, переменная a
дублируется, поэтому компиляция завершается неудачно в вашем примере.
Ответ 3
Здесь ничего не связано с switch
. Вы просто не можете объявить одну и ту же переменную дважды в той же области.
Это незаконно:
int a = 1;
int a = 2;
Теперь предположим, что вы хотели, чтобы ваши ветки case работали как области. Тогда проблема заключалась бы в том, что вы не смогли бы использовать переменную после переключения (вне области видимости).
Ответ 4
Оператор switch представляет собой блок кода. Оператор switch evalutates это выражение, затем выполняет все инструкции, которые следуют за совпадением метки case.
В этом случае он оценивает x
, и это сравнивается с каждой константой, пока не будет найдено совпадение.
Но на самом деле это похоже на высказывание:
for(int i = 0; i < 4; i++) {
int i = 1;
}
это также не сработает, потому что i
уже определен.
Ответ 5
Объем переменных в каждом аргументе case соответствует всему оператору switch.
Однако, если вы хотите использовать одну и ту же переменную, вы можете определить свой собственный блок внутри каждого оператора case, используя фигурные скобки {и}.
Ответ 6
Вы определяете a
внутри локальной области действия коммутатора. Таким образом, вы назначаете a
значение, но вы не передаете это значение нигде, поэтому оно кажется излишним.
Если вы должны были объявить a
вне коммутатора, а затем вызвать его в коммутаторе, он должен работать.
int a;
switch(x) {
case 1:
a = 1;
break;
case 2:
b = 2;
break;
}
В качестве альтернативы, в каждом случае коммутатора вы можете манипулировать своим новым int и затем делать что-то с ним следующим образом:
switch(x) {
case 1:
int a = 1;
//do something with your new int here that affects a parameter outside the switch
break;
case 2:
int b = 1;
//do something with your new int here that affects a parameter outside the switch
break;
}
Кроме того, похоже, что определение переменной несколько раз в коммутаторе является незаконным из-за конфликтов, поскольку переменная a определена в локальной области, чтобы означать одну вещь в первом случае коммутатора. Таким образом, вы не можете определить, что это означает что-то другое во втором случае.
Ответ 7
Пойдите с этими фактами:
- > Вы не можете объявить одну и ту же локальную переменную дважды в одной области.
- > case
не создает свою собственную область.
- > switch
, да создает свою собственную область.
- > Доказательство. Если вы не делаете break
случай, все случаи будут выполняться, если они не удовлетворяют условию. (в отличие от else if).