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”子句没有任何要处理的东西。
有人可以告诉我为什么吗?
答案 0 :(得分:7)
if(a==100); //Expected a compile error but did not get one.
没有编译器错误,因为它被假定为空if块,因为它以分号(;)
if(a == 101) //Compiler complains here...
这是一个不完整的if块,if中应该至少有一个语句,否则它应该由semicolon(;)
终止,如上所述。因为if不完整所以其他对编译器也没有任何意义。
答案 1 :(得分:2)
首先有一个陈述;
if(a == 101)
; // Hence there is no compile time error.
但是在第二个你没有声明。这是一个空座。
对于第二个陈述,你必须给它一个块。这样的事情: -
if(a == 101)
{
}
或
if(a == 101);
答案 2 :(得分:2)
好的,按照这种方式,你的第一个陈述相当于:
if (a == 10)
; // Here you have one statement, but that's an empty statement.
所以,你确实有一个陈述,虽然是空的。所以,编译器就可以了。只是放一个分号是一种写空块的方法,没有花括号。所以,上面的if
块实际上相当于:
if (a == 10) { }
在2 nd 案例中,
if (a == 10)
// No statement here
编译器需要在if
块后面找到一个它找不到的语句。
答案 3 :(得分:1)
sytax存在问题。 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语句没有正确的结尾。
答案 4 :(得分:0)
没有if
的{{1}}语句允许“then”子句为空;带有else
的{{1}}语句不会。
Java语言规范(§14.5 Statements)中详细解释了其原因:
与在C和C ++中一样,Java编程语言的if语句遭受所谓的“悬空
if
问题”,这种错误的格式化示例说明了这一点:
else
问题是外部
else
语句和内部if (door.isOpen()) if (resident.isVisible()) resident.greet("Hello!"); else door.bell.ring(); // A "dangling else"
语句都可能拥有if
子句。在这个例子中,有人可能会猜测程序员希望if
子句属于外部else
语句。Java编程语言,如C和C ++以及它们之前的许多编程语言,任意地规定
else
子句属于它可能属于的最内层if
。此规则由以下语法捕获:...
语句因此在语法上分为两类:那些可能以
else
语句结尾且没有if
子句(“短语句”)的语句和那些肯定不会的语句。只有明确不以短
if
语句结尾的语句可能会在具有else子句的else
语句中的关键字if
之前显示为直接子语句。这个简单的规则可以防止“悬空”的问题。具有“无短
else
”限制的语句的执行行为与没有“无短if
”限制的相同类型语句的执行行为相同; 区别仅仅是为了解决句法难度。
答案 5 :(得分: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");
}
在上面的情况下,你有一个悬在中间的地方。 If-else是一个构造,必须在一起(如果语句可以是独立的)。从逻辑上讲,如果没有,那为什么会有其他的呢。
答案 6 :(得分:0)
有sytax错误。 java支持if-else和if。
的指定语法 if(a==100);
在语句之后没有分号(;)因此它被分号终止
if(a==100)
System.out.println("a: "+a);
else
{
System.out.println("in else");
}
此代码将被执行。
答案 7 :(得分: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)
答案 8 :(得分:0)
c-heritage语言允许一个空语句,这使得表单的for
循环成为可能:
for(/*initialization*/;/*iteration*/;/*condition*/){}
这允许程序员可选地在初始化时运行代码(例如对于局部变量),迭代(递增/递减值等),最后测试循环将中断的条件。
因为这是可能的,所以也可以使用空语句。
;
;;
if(false);
for(;;);
等。都是合法的。
答案 9 :(得分:0)
根据Java Language Specification,空语句(分号本身)是一个完全合法的语句,可以在允许语句的任何地方使用。你的第一个案例
if (a==100);
就是这样。第二种情况:
if (a==100)
else { . . . }
缺少if
分支所需的语句。 (参见JLS specification of the if
statement syntax。)
答案 10 :(得分:0)
simicolon是空的陈述。写;
与{}
非常相似。它什么都不做。编译器期望if条件之后的语句。所以在if条件之后立即有一个else会给你一个编译错误,但是有一个语句(包括空语句)不会。
答案 11 :(得分:0)
char charVar = ’z’;
写一个if
语句,如果变量包含a,则条件为true,然后告诉用户变量的值为a。