为什么我在else循环中的'b'上检测到无法访问的代码?
private void a1_Click(object sender, EventArgs e)
{
Button b = (Button)sender;
if (true)
{
b.Text = "X";
}
else
{
b.Text = "O";
}
turn = !turn;
}
答案 0 :(得分:6)
看起来你打算写:
private void a1_Click(object sender, EventArgs e)
{
Button b = (Button)sender;
if (turn)
{
b.Text = "X";
}
else
{
b.Text = "O";
}
turn = !turn;
}
如上所述,将始终评估if(true)
块,使else
块无法访问。
注意:这里只是一个注释,这将是我使用三元运算符的地方(只要你遵循的约定允许你。[运算符的使用应该是一致的])。
您将获得b.Text = turn ? "X" : "O"
而不是if/else
阻止。您还可以将“X”和“O”声明为静态最终变量中的常量,以提高可读性并使修改更容易。
答案 1 :(得分:1)
else
部分,因为编译器已经知道将始终执行第一个条件if(true)
。
在JLS§14.21. Unreachable Statements
下进行了更好的解释如果语句因无法访问而无法执行,则为编译时错误。
编译器在这种情况下是如此智能,如果你将它转换为下面的代码,那么它永远不会给你这个错误
boolean flag = true
if(flag){
b.Text = "X";
}else{
b.Text = "O";
}
现在试试这个:
int x=5;
if (false) { x=3; } // same Dead code
上面的JLS部分解释了很多。
以下是一个例子:
while(true){
System.out.println("hello");
}
System.out.println("bye"); // this line is in problem
现在使用相同的标记,但将其设为final
final boolean flag = true;
while(flag ){
System.out.println("hello");
}
System.out.println("bye"); // still this line is in problem
// because compiler knows that final variable never be changed once assigned
答案 2 :(得分:0)
JVM已经在编译时评估了你的代码,并且知道else部分永远不会被重新安装