Java 为什么不能在switch中定义两次变量?
为什么这是非法的:Java 为什么不能在switch中定义两次变量?,java,switch-statement,Java,Switch Statement,为什么这是非法的: switch(x) { case 1: int a = 1; break; case 2: int a = 2; break; } 看起来这可能是合法的。有哪些深层次的原因使其非法呢?这里没有与开关相关的内容。不能在同一范围内两次声明同一变量 这是非法的: int a = 1; int a = 2; 现在,让我们假设您希望,事实上,您的案例分支充当作用域。然后问题是,您将无法在切换后使用变量(超出范围)。因为范围由{和}分隔,并且变量有两次 可以
switch(x) {
case 1:
int a = 1;
break;
case 2:
int a = 2;
break;
}
看起来这可能是合法的。有哪些深层次的原因使其非法呢?这里没有与
开关相关的内容。不能在同一范围内两次声明同一变量
这是非法的:
int a = 1;
int a = 2;
现在,让我们假设您希望,事实上,您的案例分支充当作用域。然后问题是,您将无法在切换后使用变量(超出范围)。因为范围由{
和}
分隔,并且变量有两次
可以通过以下方式避免此编译错误:
switch(x) {
case 1: {
int a = 1;
break;
}
case 2: {
int a = 2;
break;
}
}
请注意,在您的示例中,编译器未能成功,因为如果删除第一条break
语句,可能会发生调用的情况:
在遇到break语句之前,匹配大小写标签之后的所有语句都将按顺序执行,而不管后续大小写标签的表达式如何
在这种情况下,将要执行的语句(由于失败),包括:
inta=1代码>
inta=1代码>
break代码>
如您所见,a
变量是重复的,这就是在您的示例中编译失败的原因。如果不使用break语句,那么我们知道将执行以下情况。因此,如果您在这两种情况下都被允许声明,将导致冲突。比如说
switch(x) {
case 1:
int a = 1; // i have removed the break;
case 2:
int a = 2; // now what will happen here :)
break;
}
每个case子句中变量的范围对应于整个switch语句
但是,如果要使用相同的变量,可以使用大括号{和}在每个case语句中定义自己的块。您正在开关的局部范围内定义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在局部范围内定义为一件事。因此,在第二种情况下,不能将其定义为其他含义。switch语句是一个代码块。switch语句计算其表达式,然后执行匹配大小写标签后面的所有语句
在这种情况下,它计算x
,并与每个常数进行比较,直到找到匹配项
但实际上就像是说:
for(int i = 0; i < 4; i++) {
int i = 1;
}
for(int i=0;i<4;i++){
int i=1;
}
这也行不通,因为已经定义了i
。遵循以下事实:
->不能在单个范围内两次声明同一局部变量。
->案例
不创建自己的范围。
->开关
,yes创建自己的作用域。
->证明:如果你不打破一个案例,所有案例都将被执行,除非它们满足条件。(与其他if不同)。您似乎希望在切换后参考a
。但是对于哪个a
?变量范围是游戏的名称。同一作用域上不能有两个同名变量。@不,假设我在切换后不使用break
case 2中的代码将作为x=1
@Pshemo的case1
的一部分执行,但是有一个break它是无用的:切换后没有可用的。切换有这样的作用域的原因是什么?@destroy它是无用的,因为它是一个最小的示例语法…@Alex没有理由,这只是C风格范围的一种效果。完美:)!!!!