我在我的代码中写了一个简单的if/else
,效果很好。后来我在第一个级别下添加了另一级if
,并且被它的行为困惑了。这是重新创建情况的非常简单的代码:
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
为真!
事实证明else
与最近的if
绑定,虽然我没有在任何地方找到它,并且eclipse没有将不匹配的缩进级别突出显示为错误(尽管它确实纠正了它格式化文件)。
使用大括号的非常非常强烈的论据!
else
/if
的约束顺序在哪里记录?
作为挑战,
有没有办法让上面的代码能够在不添加大括号的情况下执行缩进所能达到的效果?
答案 0 :(得分:18)
有没有办法让上面的代码能够在不添加大括号的情况下执行缩进所能达到的效果?
没有。因为Java不是Python,编译器根据你的想法不起作用。这就是为什么你应该总是使用大括号。
显然,else
是内部if
的一部分,因此结果是预期的。从JLS §14.5 - Statements
答案 1 :(得分:11)
有没有办法让上面的代码做缩进所做的 你期望不添加大括号吗?
if (a)
if (b)
System.out.println("a=true, b=true");
else;
else
System.out.println("a=false");
else;
将最终完成最内层的if。
我想要注意的是,如果我在生产中遇到过这段代码,我会查看提交日志,直到找到谁编写它。这绝对是一件不可接受的事情。但它回答了引用的问题
答案 2 :(得分:10)
Language specification 14.5. Statements:
中明确说明了这一点Java编程语言遭受所谓的“悬挂其他” 问题,
语句因此在语法上分为两类:那些可能以if语句结尾但没有else子句的语句(“if if statement”)和那些绝对不会的语句。
只有明确不以short if语句结尾的语句才可能在具有else子句的if语句中的关键字else之前显示为直接子语句。
答案 3 :(得分:4)
记录在Java语言规范的Section 14.5中:
问题在于外部if语句和内部if 声明可能会拥有else子句。在这个例子中,一个 可能推测程序员打算将else子句归属 到外部的if语句。
Java编程语言,如C和C ++以及许多编程 在他们之前的语言,任意地命令else子句属于 到最可能属于它的最内层。这条规则是 通过以下语法捕获:
答案 4 :(得分:4)
有没有办法让上面的代码做缩进所做的 你期望不添加大括号吗?
我会去:
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");
}
答案 5 :(得分:1)
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");
}
答案 6 :(得分:0)
首先,最好的建议是始终使用大括号!
当然,每个else语句都附加到最近的if语句,这在this link中很明显,这就是你的代码以这种方式运行的原因。编译器不关心缩进。您可以将整个代码写在一行上,只要语法正确,它仍然可以工作。
另外,如果你想要你期望的输出,那么将if语句嵌套在另一个if语句中(没有else语句)是一种原始的做法;这可以简单地使用&&
运算符完成,如下所示:
if (a && b)
System.out.println("a=true, b=true");
else
System.out.println("a=false");
您已获得所需的输出。我希望这有帮助..快乐编码!