2013-08-19 8 views
2
class if1 
{ 

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

Я ожидал, что компилятор выдает мне сообщение об ошибке, но на удивление он скомпилирован просто отлично. В чем заключается причина, по которой компилятор должен игнорировать, имеет ли оператор «if» какие-либо инструкции для обработки или нет. Почему это не вызывает ошибку, как в следующем случае?if/else statement в Java

class if2 
{ 

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

    } 
    } 
} 

В приведенном выше заявлении компиляция жалуется, что в предложении «если» нет необходимости обрабатывать.

Может ли кто-нибудь сказать мне, почему?

+2

Если условие требует по крайней мере одного заявления. В первом случае это «;». Во втором случае оно пустое. – qasimzee

+0

@qasimzee 'if' нуждается * точно * один оператор или блок. –

+0

Да, согласен. Спасибо – qasimzee

ответ

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

не предполагается, нет ошибок компилятора, как это будет пустой, если блок, как это заканчивается точкой с запятой (;)

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

Это неполный, если блок, должен быть по крайней мере один оператор, если или он должен быть прерван semicolon(;), как указано выше. Поскольку if не является полным, так что еще и не будет иметь никакого смысла для компилятора.

+0

Спасибо за предоставление четкого и четкого ответа :) – UnderDog

+0

Если это помогло, просто примите его :-) Практика принятия ответа помогает другим сталкиваться с одной и той же проблемой. –

+0

Фактически для каждой ветви должно быть _exactly_ одного оператора (который может быть [block] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.2)). –

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 не имеет правильного окончания.

+0

Спасибо, что заметили, я обновил свой ответ. –

2

В первом есть один оператор ;

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

Но во второй тебе не утверждение. Это пустой блок.

Для второго заявления вы должны предоставить ему блок. Что-то вроде этого: -

if(a == 101) 
{ 
} 

или

if(a == 101); 
0

if заявление без else разрешает "то" положение, чтобы быть пустым; if с else нет.

Причина этого объясняется более подробно в спецификации языка Java (§14.5 Statements):

Как и в C и C++, если заявление на языке программирования Java страдает от так называемого «болтающегося 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, могут отображаться как непосредственное подзадача перед ключевым словом else в операторе if, который имеет предложение else.

Это простое правило предотвращает проблему «болтаться еще». Поведение выполнения оператора с ограничением «без коротких if» идентично исполнению такого же вида без ограничения «no short if»; различие составлено исключительно для разрешения синтаксической трудности.

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 - это конструкция и должна быть вместе (если оператор может быть независим, хотя). Логично, почему бы и другое, если нет, если.

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 блока, который он не находит.

0

Ошибка sytax. java поддерживает указанный синтаксис if-else и if.

 if(a==100); 

После заявления не точка с запятой (;), так что блок, как это заканчивается точкой с запятой

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

} 

Этот код будет выполнять.

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) 
0

Языки c-наследия perm это пустое заявление, которое делает возможным for петлю формы:

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

Это позволяет программисту необязательно запускать код при инициализации (например, для локальных переменных), итерации (увеличение/уменьшение значения, и т.д.), и, наконец, проверить условие, при котором петля сломается.

Поскольку это возможно, возможны и пустые утверждения.

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

и т. Д. Все юридические.

0

В соответствии с Java Language Specificationпустой оператор (точка с запятой сама по себе) является совершенно законным заявлением, которое может использоваться везде, где допускается утверждение. Ваш первый случай

if (a==100); 

- это именно то. Второй случай:

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

отсутствует заявление, которое требуется для if отрасли. (См. JLS specification of the if statement syntax.)

0

Simicolon - это пустое заявление.Письмо ; очень похоже на {}. Он ничего не делает. Компилятор ожидает утверждение после условия if. Таким образом, наличие else сразу после условия if даст вам ошибку компилятора, но иметь оператор (включая пустой оператор) не будет.

0

char charVar = ’z’;

Напишите if о том, что если переменная держит, условие истинно, а затем сообщить пользователю значение переменной является.