Java if-if-else行为
我在我的代码中写了一个简单的if/else
,工作正常。 后来我在第一个下面添加了另一个级别,并且被它的行为困惑了。 这是重新创建情况的非常简单的代码:
public static void main(String[] args) { boolean a = true; boolean b = false; if (a) if (b) System.out.println("a=true, b=true"); else System.out.println("a=false"); }
它返回“ a=false
”,即使a
是真的!
事实certificate, else
与最近的if
绑定,虽然我没有发现它在任何地方都有记录,并且eclipse没有将不匹配的缩进级别突出显示为错误(尽管它在格式化文件时确实纠正了它)。
使用大括号的一个非常非常强大的论据!
else
/if
记录的绑定顺序在哪里?
作为挑战,
是否有一种方法可以使上面的代码执行缩进使您期望的内容而不添加大括号?
是否有一种方法可以使上面的代码执行缩进使您期望的内容而不添加大括号?
不是。因为Java不是Python,并且编译器根据您的想法不起作用。 这就是为什么你应该总是使用大括号。
显然, else
是内在的一部分,因此结果是预期的。 从JLS§14.5 – 陈述中可以看出这一点
是否有一种方法可以使上面的代码执行缩进使您期望的内容而不添加大括号?
if (a) if (b) System.out.println("a=true, b=true"); else; else System.out.println("a=false");
else;
将最终完成最内层的if。
我想要注意的是,如果我在生产中遇到过这段代码,我会查看提交日志,直到找到谁编写它。 这绝对是一件不可接受的事情。 但它回答了引用的问题
语言规范14.5中明确规定了这一点。 声明:
Java编程语言遭受所谓的“悬挂其他问题,
因此,语句在语法上分为两类:那些可能在没有else子句的if语句中结束的语句(“if if语句”)和那些绝对不能的语句。
只有明确不以short if语句结尾的语句才会在if语句中具有else子句的关键字else之前显示为直接子语句。
它在Java语言规范的第14.5节中 有记录:
问题是外部if语句和内部if语句都可能会拥有else子句。 在这个例子中,人们可能会猜测程序员希望else子句属于外部if语句。
Java编程语言,如C和C ++以及它们之前的许多编程语言,任意地规定else子句属于它可能属于的最内层。 此规则由以下语法捕获:
是否有一种方法可以使上面的代码执行缩进使您期望的内容而不添加大括号?
我会去:
public static void main(String[] args) { boolean a = true; boolean b = false; if (!a) System.out.println("a=false"); else if(b) System.out.println("a=true, b=true"); }
public static void main(String[] args) { boolean a = true; boolean b = false; if (a && b) System.out.println("a=true, b=true"); else if (!a) System.out.println("a=false"); }
首先,最好的建议是始终使用大括号!
当然,每个else语句都附加到最近的if语句 ,这在此链接中很明显, 这就是您的代码以这种方式运行的原因。 编译器不关心缩进。您可以将整个代码写在一行上,只要语法正确,它仍然可以工作。
另外,如果你想要你想要的输出 ,将if语句嵌套在另一个if语句中(没有else语句)是一种原始的做法; 这可以简单地使用&&
运算符完成,如下所示:
if (a && b) System.out.println("a=true, b=true"); else System.out.println("a=false");
你已经得到了你想要的输出。 我希望这有帮助..快乐编码!