3
class if1
{

  public static void main(String args[])
  {
    int a = 100;
    if(a==100); //Expected a compile error but did not get one.    
  }    
}

我预计编译器会给我一个错误,但令人惊讶的是它编译得很好。编译器忽略“if”语句是否有任何要处理的语句的理由是什么。为什么它不会像以下情况那样抛出错误?

class if2
{

  public static void main(String args[])
  {
    int a = 100;
    if(a == 101) //Compiler complains here...
    else
    {
      System.out.println("in else");

    }
  }
}

在上面的语句中,编译器抱怨“if”子句没有任何要处理的东西。

有人能告诉我为什么吗?

4

12 回答 12

7
if(a==100); //Expected a compile error but did not get one.

没有编译器错误,因为它被假定为空 if 块,因为它以分号终止(;)

if(a == 101) //Compiler complains here...

这是一个不完整的 if 块,在 if 中应该至少有一个语句,否则它应该semicolon(;)如上所述终止。由于 if 不完整,因此 else 对编译器也没有任何意义。

于 2013-08-19T05:24:10.487 回答
2

在第一个有一个声明;

 if(a == 101)
 ; // Hence there is no compile time error.

但在第二个中,你没有声明。这是一个空块。

对于第二个语句,你必须给它一个块。像这样的东西: -

if(a == 101)
{
}

或者

if(a == 101);
于 2013-08-19T05:25:27.720 回答
2

好吧,就这样吧,你的第一个语句相当于:

if (a == 10)
    ;   // Here you have one statement, but that's an empty statement.

所以,你确实有一个声明,虽然是一个空的。所以,编译器没问题。只放一个分号是一种写一个空块的方法,没有花括号。所以,上面的if代码块真的等价于:

if (a == 10) { }

在第 2情况下,

if (a == 10)
    // No statement here

编译器期望在if块之后有一条语句,但它没有找到。

于 2013-08-19T05:27:09.803 回答
1

语法有问题。java 支持if-else和的指定语法if

if(a==100); // Empty if block
if(a==100)  // if block following with single statement
  System.out.println("a: "+a);

两者都是有效的if陈述。

对于这种情况if-else——

if(a==100)
   System.out.println("a: "+a);
else
   System.out.println("else ");
or    
if(a==100){
   System.out.println("a: "+a);
}else{
   System.out.println("else ");
}

这两个都是有效的。但

if(a == 101) 
else{...} 

这不是无效的,因为 if 语句没有正确的结尾。

于 2013-08-19T05:24:33.313 回答
0

没有的if语句else允许“then”子句为空;带有不的if语句。else

Java 语言规范( §14.5 声明)中详细解释了其原因:

与在 C 和 C++ 中一样,Java 编程语言的 if 语句存在所谓的“悬空else问题”,这个格式误导的示例说明了这一点:

if (door.isOpen())
   if (resident.isVisible())
      resident.greet("Hello!");
else door.bell.ring();  // A "dangling else"

问题是外部if语句和内部if语句都可能拥有该else子句。在这个例子中,人们可能会猜测程序员打算让else子句属于外部if语句。

Java 编程语言,如 C 和 C++ 以及它们之前的许多编程语言,任意规定一个else子句属于if它可能属于的最内层。此规则由以下语法捕获:

……

因此,语句在语法上分为两类:可能以if没有else子句的语句(“短 if 语句”)结尾的语句和绝对没有子句的语句。

只有绝对不以短if语句结尾的语句才能作为直接子语句出现在具有 else 子句else的语句中的关键字之前。if

这个简单的规则可以防止“悬空其他”问题。带有“no short”限制的语句的执行行为与没有“no short if”限制的同类语句的执行行为相同if这种区别纯粹是为了解决句法上的困难。

于 2013-08-19T05:25:33.607 回答
0
if(a==100); //Expected a compile error but did not get one.

这是完全有效的(虽然没有任何用处)。你是说如果一个变量等于 100 什么都不做。以上等价于

if(a==100){}

if(a == 101) //Compiler complains here...

else
{
 System.out.println("in else");

}

在上述情况下,您有一个 else 挂在偏僻的地方。if-else 是一个结构,必须在一起(尽管 if 语句可以是独立的)。从逻辑上讲,如果没有 if,为什么会有 else。

于 2013-08-19T05:26:45.140 回答
0

存在语法错误。java 支持 if-else 和 if 的指定语法。

     if(a==100);

在语句之后没有分号(;)所以阻塞,因为它以分号终止

if(a==100)
System.out.println("a: "+a);
else
 {
 System.out.println("in else");

 }

此代码将被执行。

于 2013-08-19T05:28:04.867 回答
0

if(a == 101)由于这不是声明,因此您在这里遇到错误。你必须放(;)。没有问题代码 if(a == 101);

if我们可以用语句做一些这样的事情。

 if(a==2)
 System.out.println("This is correct"); 

所以我们也可以按如下方式使用它

 if(a==0)
  ;

但是你不能这样做,因为你必须放 (;)

if(a==2)
System.out.println("This is correct")

然后以下也无效

if(a==2)
于 2013-08-19T05:31:08.933 回答
0

c-heritage 语言允许一个空语句,它可以实现for以下形式的循环:

for(/*initialization*/;/*iteration*/;/*condition*/){}

这允许程序员在初始化(例如局部变量)、迭代(增加/减少一个值等)时有选择地运行代码,最后测试循环中断的条件。

因为这是可能的,所以空语句也是可能的。

;
;;
if(false);
for(;;);

等等都是合法的。

于 2013-08-19T05:32:32.190 回答
0

根据Java 语言规范空语句(分号本身)是完全合法的语句,可以在任何允许使用语句的地方使用。你的第一个案例

if (a==100);

正是这样。第二种情况:

if (a==100)
else { . . . }

if缺少分支所需的语句。(请参阅语句语法的JLS 规范if。)

于 2013-08-19T05:36:08.590 回答
0

分号是空语句。写法;非常相似{}。它什么也不做。编译器期望在 if 条件之后有一个语句。因此,在 if 条件之后立即有一个 else 会给你一个编译器错误,但有一个语句(包括空语句)不会。

于 2013-08-19T05:45:41.477 回答
0

char charVar = ’z’;

写一个if语句,如果变量持有a,则条件为真,然后告诉用户你的变量的值是a。

于 2014-04-29T20:56:36.913 回答