Почему блок IF разрешен внутри другого IF, который не имеет фигурных скобок в JAVA

Обычно в JAVA, если оператор IF не имеет фигурных скобок, может иметь только одну строку, которая выполняется при выполнении условия IF, однако, если другой блок IF (внутренний IF) следует за начальным IF, то ошибка не возникает, и есть больше линии. Как это возможно?

Пример

if (true)
if (true)
   System.out.println("true");
else
   System.out.println("false");

person Alin    schedule 10.08.2013    source источник
comment
полезно прочитать cs.umd.edu/~clin/MoreJava/ ControlFlow/вложенный-if.html   -  person NullPoiиteя    schedule 10.08.2013
comment
Java НАПИСЫВАЕТСЯ НЕ ЗАГЛАВНЫМИ БУКВАМИ, а только с одной заглавной буквой, например: Java. :)   -  person Martijn Courteaux    schedule 10.08.2013
comment
самый первый оператор после if будет учитываться в теле if   -  person NullPoiиteя    schedule 10.08.2013
comment
связанные с однострочными операторами IF в java, и за одну минуту я получил миллионы результатов в Google для этого, и этот оператор if был бы лучшим ответом каждый   -  person NullPoiиteя    schedule 10.08.2013
comment
Спасибо всем за ваши ответы. Очень хорошие отзывы.   -  person Alin    schedule 10.08.2013


Ответы (4)


Обычно в JAVA, если оператор IF не имеет фигурных скобок, может иметь только одну строку, которая выполняется при выполнении условия IF,

Коррекция. Оператор if без фигурных скобок может иметь только один оператор, который выполняется при выполнении условия. И синтаксис if выглядит примерно так

if (<condition>) <statement>; [else <statement>;]

То есть, если есть else, это часть if. Это все одно заявление.

Причина отсутствия ошибки в том, что здесь нет двусмысленности. (Ну, во всяком случае, не для компилятора.) Поскольку else является частью if, он соответствует ближайшему if. Итак, при правильном отступе у вас есть

if (true)
    if (true)
       System.out.println("true");
    else
       System.out.println("false");
person cHao    schedule 10.08.2013

Нет ошибок, потому что он равен

if (true) {
    if (true) {
       System.out.println("true");
    }
    else
    {
       System.out.println("false");
    }
}

И допустимый синтаксис.

Но, пожалуйста, всегда используйте {}, иначе очень сложно понять, где именно заканчивается блок if.

person Suresh Atta    schedule 10.08.2013
comment
+1 Я предлагаю вам всегда использовать стандартный отступ или использовать IDE, чтобы сделать это за вас. Таким образом, вы можете четко видеть вложение, даже если у вас нет { } - person Peter Lawrey; 10.08.2013
comment
если (истина) int x=0; интервал у=0; идентично if (true) {int x=0; int y=0;} и все равно возвращает ошибку. - person Alin; 10.08.2013
comment
@Alin Какая у тебя ошибка ?? - person Suresh Atta; 10.08.2013
comment
Я получаю сообщение об ошибке, если помещаю else после двух операторов, а фигурные скобки — нет. Если у меня нет if, int y=0; он не будет выполняться как часть блока if. - person Alin; 10.08.2013
comment
Я не уверен, я понял, что теперь вы столкнулись с проблемой области видимости локальных переменных, а также одна из основных причин - всегда использовать {} - person Suresh Atta; 10.08.2013
comment
Нет. Вы говорите, что if(true) if(true) System.out.println(true); иначе System.out.println(false); не возвращает ошибку, потому что может быть переведен в операторы с фигурными скобками. Но имея if(true) if(true) System.out.println(true1); Система.out.println(true2); иначе System.out.println(false); также может быть переведен в операторе с фигурными скобками, но компилятор жалуется, поэтому возможность перевода не является причиной, по которой работает. Надеюсь это прояснить. Я использовал переменные, потому что отпечатки длиннее, а код в комментариях не очень читаем. Спасибо - person Alin; 10.08.2013

Это потому, что ваш внешний блок if действительно содержит один оператор.

  • Если внутреннее условие if истинно, внешнее if эквивалентно:

    if (true)
        System.out.println("true");
    
  • И если, внутреннее if условие, если false, то это эквивалентно:

    if (true)
        System.out.println("false");
    

Тем не менее, это действительно плохая идея - опускать фигурные скобки вокруг if-else или циклов, если уж на то пошло, и особенно делать это с вложенным блоком, может обернуться злом. То, что это можно сделать, не означает, что вы должны это делать.

Чтобы увидеть, как вложенные блоки if без фигурных скобок могут стать уродливыми и часто приводить к ошибкам, рассмотрите этот код. Как вы думаете, каким должен быть вывод?

boolean b = true;
boolean b2 = false;

if (b)
    if (true)
       System.out.println("true");
       if (b2)
           System.out.println("Hello");
else
    System.out.println("false");
person Rohit Jain    schedule 10.08.2013

рассмотрите этот оператор IF как:

    if(true) {
       if(true) {
           System.out.println("true"); 
       }
       else {
           System.out.println("false");
       }
    }

если первый IF равен true, он переходит к следующему оператору, здесь следующий оператор также является IF, а также true, поэтому он выполняет в нем операторы. Если предположить, что оно ложно, то он ищет else и выполняет операторы в else. Таким образом, все операторы защищены, и сценарий ошибки не возникает.

person Ashwani    schedule 10.08.2013