Java 带有不可检查的else的IF语句
你能解释一下为什么下面显示的方法是由Java编译和运行的吗Java 带有不可检查的else的IF语句,java,if-statement,Java,If Statement,你能解释一下为什么下面显示的方法是由Java编译和运行的吗 public static void testIf(int v){ if (v < 10) if (v >20 ) System.out.println(" 20 IF"); else System.out.println(" 20 ELSE"); else System.out.println("10 Else"); }
public static void testIf(int v){
if (v < 10)
if (v >20 )
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
else
System.out.println("10 Else");
}
publicstaticvoidtestif(intv){
如果(v<10)
如果(v>20)
系统输出打印项次(“20如果”);
其他的
系统输出打印项次(“20其他”);
其他的
系统输出打印项次(“其他10项”);
}
- 通常每个IF都应该与最近的ELSE链接,为什么最后一个ELSE不是悬挂的ELSE?而且与假设有联系
- 最后一个是无法访问的,为什么允许
诚恳地说,是这样工作的,如果v小于10,那么你应该得到打印值10
public static void testIf(int v){
if (v < 10) {
if (v >20 ) {
System.out.println(" 20 IF");
} else {
System.out.println(" 20 ELSE");
}
} else {
System.out.println("10 Else");
}
}
publicstaticvoidtestif(intv){
如果(v<10){
如果(v>20){
系统输出打印项次(“20如果”);
}否则{
系统输出打印项次(“20其他”);
}
}否则{
系统输出打印项次(“其他10项”);
}
}
编辑:如果没有任何大括号,它看起来像这样;不知道如何格式化,所以请容忍我
public static void testIf(int v){
if (v < 10)
if (v >20 ) System.out.println(" 20 IF");
else System.out.println(" 20 ELSE");
else System.out.println("10 Else");
}
publicstaticvoidtestif(intv){
如果(v<10)
如果(v>20)系统输出打印项次(“20如果”);
else System.out.println(“20 else”);
else System.out.println(“10 else”);
}
如果没有大括号,if
可以接受一条语句——在本例中,是if-else。因此,第一个else
匹配内部if
,第二个else
匹配外部if
。添加大括号并正确缩进代码使其更易于理解:
if (v < 10) {
if (v >20) {
System.out.println(" 20 IF");
} else {
System.out.println(" 20 ELSE");
}
else {
System.out.println("10 Else");
}
if(v<10){
如果(v>20){
系统输出打印项次(“20如果”);
}否则{
系统输出打印项次(“20其他”);
}
否则{
系统输出打印项次(“其他10项”);
}
通常每个IF都应该与最近的ELSE链接,为什么最后一个ELSE不是悬空的ELSE?而且与what IF链接
如果你能很好地格式化你的代码,那就更有意义了
if (v < 10)
if (v > 20)
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
else
System.out.println("10 Else");
if(v<10)
如果(v>20)
系统输出打印项次(“20如果”);
其他的
系统输出打印项次(“20其他”);
其他的
系统输出打印项次(“其他10项”);
这是完全正确的。因为当您没有{}
时,只有一行代码绑定到作用域ifif
。但是在您的情况下,if后面的下一行是另一行ifif
,因此作用域仍然有效
然而,逻辑看起来并不好,但是代码仍然可以很好地执行
正如其他人所指出的,为了让世界幸福,人们总是喜欢使用{}
最后一个是无法访问的,为什么允许
如果您的v
值=10
第二个else
属于第一个if
,第二个if
和第一个else
属于第一个if
中间的if-else块,则可以访问
if (v >20 )
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
java将其视为外部if的内部块。我的意思是,您的代码编译为:
if (v < 10){
if (v >20 )
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
}
else
System.out.println("10 Else");
if(v<10){
如果(v>20)
系统输出打印项次(“20如果”);
其他的
系统输出打印项次(“20其他”);
}
其他的
系统输出打印项次(“其他10项”);
如果您不打算使用正确的缩进和括号,那么:
if (v < 10) if (v > 20) System.out.println(" 20 IF"); else System.out.println(" 20 ELSE"); else System.out.println("10 Else");
if(v<10)if(v>20)System.out.println(“20 if”);else System.out.println(“20 else”);else System.out.println(“10 else”);
一个好的做法是使用大括号。{}
所以你的代码看起来像这样
public static void testIf(int v) {
if (v < 10) {
//This will actually never be true, since v cannot be both less than
//10 and at the same time greater than 20.
if (v >20 ) {
System.out.println(" 20 IF");
}
else {
System.out.println(" 20 ELSE");
}
}
else {
System.out.println("10 Else");
}
}
最后一个else语句将无法访问,因为if和else语句是两个不同的语句。因此,如果不使用大括号,代码将被视为-
if(v<10)
{
if(v>20)
System.out.println("20 IF");
}
// now the following else statement will be of ""if(v<10)"" and not
// ""if(v>20)""
else
{
System.out.println("20 ELSE"); // its not of (20 ELSE)
}
if(v20)
系统输出打印项次(“20如果”);
}
//现在,下面的else语句将是关于“if(v20)”的
其他的
{
System.out.println(“20-ELSE”);//它不属于(20-ELSE)
}
任何后面没有前面if语句的else语句都将给出错误。else匹配if
如果使用格式化程序,它将显示哪些If和else匹配:
public static void testIf(int v) {
if (v < 10)
if (v > 20)
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
else
System.out.println("10 Else");
}
publicstaticvoidtestif(intv){
如果(v<10)
如果(v>20)
系统输出打印项次(“20如果”);
其他的
系统输出打印项次(“20其他”);
其他的
系统输出打印项次(“其他10项”);
}
你的假设“通常每个IF都应该与最接近的其他IF链接”并不完全正确。如果不使用花括号,If和else的主体是紧跟其后的第一条语句。这种情况发生在第二个最里面的if(见下面的规则)上,然后发生在第一个if上
本文将讨论Java如何选择要使用的其他工具。特别是悬空else(其中有两个if和一个else)的情况,其解决方法如下:
java编程语言,如C和C++以及许多编程
在它们之前的语言,任意地命令else子句属于
如果它可能属于最里面的话
当然,您的示例就是为什么您应该在每个if语句中添加花括号(和缩进),因为这样更清楚
可达性
在您的示例中,不可能达到“20if”语句,因为它要求V既小于10又大于20。虽然Java确实有一些无法访问的代码,但这并不是针对所有可能无法访问的条件的优化。显示完成了哪些检查
有很多规则,但对于控制语句,它们只查看表达式是否为有效常量(始终为true或false)。对于if语句,甚至未执行此检查,因此它们可用于禁用一段代码:
这种方法与其他对照组的治疗方法是一致的
结构。但是,为了允许使用if语句
为了便于“条件编译”,实际规则
不同
请考虑前两个if语句之间的空格。
public static void testIf(int v) {
if (v < 10)
if (v > 20)
System.out.println(" 20 IF");
else
System.out.println(" 20 ELSE");
else
System.out.println("10 Else");
}