В Java это считается примером «вложенного оператора IF»? - PullRequest
6 голосов
/ 04 сентября 2010

Здесь у нас есть давнее предположение, которое нужно прояснить в моей голове.Ниже приведен пример вложения операторов if:

if (...)
  ...;
else if (...)
  ...;

У меня сложилось впечатление, что для вложения требуется выражение if в другом if, например:

if (...)
  if (...)
    ...;

или, по крайней мере, четкое разделение области видимости, когда вы вкладываетесь внутрь else, например так:

if (...)
  ...;
else { //if the next statement didn't 
       //exist, then the curly brace changes nothing?
  ...;
  if (...)
    ...;
}

Это может сводиться к тому, как компилятор интерпретирует вещи, считается ли 'if' в else-ifна том же уровне, что и родительский элемент if, или создают ли они «новые» операторы if.Спасибо за потраченное время!

edit: Я спрашиваю, потому что я являюсь ТА в лаборатории Java, и тема дня была nested-ifs.В конце я узнал, что учитель считает мой первый пример верным для «вложенных операторов if».

Ответы [ 12 ]

20 голосов
/ 04 сентября 2010

Конечно, это гнездо. Вложенность не имеет ничего общего с тем, как вы форматируете код.

if (...)
{
    // some code
}
else if (...)
{
    // some code
}
else
{
    // some code
}

в точности эквивалентно

if (...)
{
    // some code
}
else
{
    if (...)
    {
        // some code
    }
    else
    {
        // some code
    }
}

В Java нет другого ключевого слова else, этот эффект достигается исключительно соглашением о форматировании, которое предотвращает смещение длинных цепочек вложенных строк прямо на экран.

В случае, если кому-то нужно убедить, вот спецификация для оператора if: Раздел спецификации языка Java 14.9

12 голосов
/ 04 сентября 2010

Это оператор if :

if (condition1) {
    // ...
}

Это вложенный оператор if :

if (condition1) {
    // ...
    if (condition2) {
        // ...
    }
    // ...
}

Это оператор if-else :

if (condition1) {
    // ...
} else {
    // ...
}

Это оператор цепочки if-else :

if (condition1) {
    // ...
} else if (condition2) {
    // ...
}
7 голосов
/ 04 сентября 2010

Вложенный, если это так:

if (...)
  if (...)
    ...;

Первый приведенный вами пример - просто if/else.

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

4 голосов
/ 04 сентября 2010

Концептуально, для меня первая форма

if (cond1)
{
}
else if (cond2)
{
}
else
{
}

не является вложенным, поскольку все условия оцениваются на одном и том же логическом уровне. Другими словами, я читаю это как «ветвь действия, основанные на cond1: cond2: что-нибудь еще».

if (cond1){ 
   if (cond2){ 
     if (cond3){ 

Вложено, потому что у вас есть условия, оцененные в других условиях, то есть зависит от предыдущих условий. Если вы хотите быть буквально об этом, область действия cond2 во втором случае буквально вложена в область действия cond1. Это не так в первой форме.

Я никогда не думал, что это было спорным.

edit: если вам когда-либо приходилось читать код вроде this , разница может показаться менее академичной.

2 голосов
/ 04 сентября 2010

Я не считаю первую форму (if / else if / etcetera) «вложенной».Скорее, это больше похоже на блок переключателей, который я бы тоже не считал вложенным.

2 голосов
/ 04 сентября 2010

Я бы взял все три вложенных if.Поскольку существует общее согласие по другим случаям, я сконцентрируюсь на вашем первом случае:

Этот код является вложенным, если, с моей точки зрения, поскольку один if является чем-то вроде

if(...) { } else { }

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

Но на самом деле это сводится к точному определению «вложенного»если ", и я не думаю, что есть общепринятый.

Почему вы спрашиваете?Если это относится к эффективности кода, то это не зависит исключительно от уровня вложенности.Если это связано с некоторыми рекомендациями относительно уровней вложенности, то в руководстве должно быть четко указано, как именно оно определяет «вложенные условия».

1 голос
/ 04 сентября 2010

Я понимаю это так же, как и вы.

Если реализация тайно поддерживает только ключевые слова "if" и "else", я предполагаю, что вы могли бы рассмотреть выражение "if" в "else if" как выражение if, вложенное в оператор "else". Но я не вижу в этом особого значения. Область «else» в этом случае содержит только «if», поэтому она фактически действует как единая область.

Это легкое любопытство, или у вас проблемы со сферой охвата?

0 голосов
/ 14 марта 2018

вложенное выражение if означает: в условии if помещено другое условие if

0 голосов
/ 04 сентября 2010

В конструкции

if (...)
  ...
else {
  if (...)
    ...
}

else идентифицирует неявное , если : , если антецедент ложен .

Наличиеif вложенный в эту область else, то, по моему мнению, семантически квалифицируется как вложенный if оператор.

0 голосов
/ 04 сентября 2010

Если он находится внутри другого блока if, то это вложенный if.Первый случай - это оператор if-else.

...