Является ли этот оператор IF вложенным или нет? - PullRequest
1 голос
/ 11 апреля 2009

вход X:

if (0 <= X and X < 49)
    output "abc"
else if (50 <= X and X < 70)
    output "def"
else if (70 <= X and X < 85)
    output "ghi"
else if (85 <= X and X < 100)
    output "jkl"
endif

Ответы [ 9 ]

8 голосов
/ 11 апреля 2009

Вы можете подумать, что это логически эквивалентно следующему:

if(a) {
    // code
} else {
    if(b) {
        // code
    } else {
        // code
    }
}

Так что в этом отношении вы можете назвать это вложенным. В C и аналогичных языках это именно так и работает, поскольку нет доступного оператора elseif. Хотя фигурные скобки не являются обязательными, я просто включил их, чтобы сделать их более понятными.

5 голосов
/ 11 апреля 2009

Они вложенные, но отформатированы так, как не.

Ваш код такой же как:

if (0 <= X and X < 49)
    output "abc"
else
    if (50 <= X and X < 70)
        output "def"
    else
        if (70 <= X and X < 85)
            output "ghi"
        else
            if (85 <= X and X < 100)
                output "jkl"
            endif
        endif
    endif
endif

Это не гнездо:

if (0 <= X and X < 49)
    output "abc"
endif
if (50 <= X and X < 70)
    output "def"
endif
if (70 <= X and X < 85)
    output "ghi"
endif
if (85 <= X and X < 100)
    output "jkl"
endif

Это действительно для всех (?) Языков, которые имеют операторы if (игнорируя такие вещи, как использование {} вместо endif)

Тем не менее, некоторые языки имеют фактическую команду "elseif" (или "elif"), и в этом случае вы будете не гнездиться, а записаны как "иначе, если", вы можете предположить, что это просто другой формат гнездо.

3 голосов
/ 11 апреля 2009

Я бы сказал, да, они вложенные. Ваш код в точности соответствует

if (0 <= X and X < 49)
    output "abc"
else
    if (50 <= X and X < 70)
        output "def"
    else
        if (70 <= X and X < 85)
            output "ghi"
        else
            if (85 <= X and X < 100)
                output "jkl"
endif

Обратите внимание, что я только изменил пробел. Когда язык оценивает предложения if...else if...else, он проверяет каждое из них, пока не найдет истинное предложение (или не достигнет финального else). Вложенные if оцениваются точно так же. Также обратите внимание, что это не обязательно так, если есть явное ключевое слово elsif.

Еще одна вещь, которую я заметил, следующее не эквивалентно вашему коду:

if (0 <= X and X < 49)
    output "abc"

if (50 <= X and X < 70)
    output "def"

if (70 <= X and X < 85)
    output "ghi"

if (85 <= X and X < 100)
    output "jkl"

Вложенность необходима для предотвращения вывода всего текста при выполнении всех условий.

3 голосов
/ 11 апреля 2009

Это зависит от реального языка и от того, как он написан.

Например, используя VB, эти If операторы не являются вложенными:

If 0 <= x And x < 49 Then
    output("abc")
ElseIf 50 <= x And x < 70 Then
    output("def")
ElseIf 70 <= x And x < 85 Then
    output("ghi")
ElseIf 85 <= x And x < 100 Then
    output("jkl")
End If

Пока эти If операторы вложены:

If 0 <= x And x < 49 Then
    output("abc")
Else
    If 50 <= x And x < 70 Then
        output("def")
    Else
        If 70 <= x And x < 85 Then
            output("ghi")
        Else
            If 85 <= x And x < 100 Then
                output("jkl")
            End If
        End If
    End If
End If
1 голос
/ 11 апреля 2009

Это несколько бессмысленная игра семантики; это зависит от синтаксиса языка.

Например, в C-подобном синтаксисе они обычно считаются вложенными в предложениях else, при этом пропущенные фигурные скобки скрывают этот факт. В этом случае пример Турнера прав.

В некоторых других языках, таких как Python и VB, «else-if» является собственной атомарной конструкцией. В этом случае «если» нельзя считать находящимся внутри «другого», поэтому его нельзя назвать «вложенным».

if (0 <= X and X < 49)
    output "abc"
else if (50 <= X and X < 70)
    output "def"
endif

Вы не определили синтаксис своего псевдокода в достаточной степени, чтобы сказать наверняка, но конечный "endif" подозрительный. Его существование не соответствует стилю C-фигурных скобок; и тот факт, что есть только один из них и не более -

else
    if (50 <= X and X < 70)
        output "def"
    endif
endif

- означает, что она также не соответствует модели с фигурными скобками (или началом / концом). Поэтому, судя по этому синтаксису, я бы поместил ваш язык псевдокодов в лагерь «atomic else-if» и сказал бы совершенно произвольно: Нет, ваше выражение if не является вложенным.

(Но вы всегда могли определить язык, в котором endifs являются необязательными или зависят от пробелов. Или, возможно, вы определили язык, где вышеприведенная программа печатает «Hello world», затем удаляет все ваши файлы. И имеет встроенный читатель почты.)

1 голос
/ 11 апреля 2009

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

Вы показываете:

if (0 <= X and X < 49)
    output "abc"
else if (50 <= X and X < 70)
    output "def"
else if (70 <= X and X < 85)
    output "ghi"
else if (85 <= X and X < 100)
    output "jkl"
endif

Это явно одно if ... endif утверждение, и поэтому нет вложенности. Если бы было несколько endif операторов, оно было бы вложенным:

if (0 <= X and X < 49)
    output "abc"
else
    if (50 <= X and X < 70)
        output "def"
    else
        if (70 <= X and X < 85)
            output "ghi"
        else
            if (85 <= X and X < 100)
                output "jkl"
            endif
        endif
    endif
endif

Итак, на вашем языке кажется, что ключевое слово elif (используется оболочкой Bourne) и elsif (используется Perl) и ElseIf (используется Visual Basic) пишется else if.

Если бы не было явного endif, чтобы отметить конец утверждения, то я был бы согласен с другими ответами - что операторы if (множественное число!) Являются вложенными, хотя расположение является совершенно разумным рекомендуется.

0 голосов
/ 11 апреля 2009

Нет, это не так.

Вложенный оператор - это оператор, который появляется внутри одного и того же оператора, например If ... If. Если ... ElseIf все в одном и том же "утверждении".

0 голосов
/ 11 апреля 2009

Может быть реализовано как вложенный цикл, в зависимости от языка. Однако, как вы логически не написали, это не будет считаться.

0 голосов
/ 11 апреля 2009

Об изменении: не берите в голову, я соглашусь, что я был wronfg на этом.

Это не так, потому что if не проверяется внутри другого if, который проверял true.

В частности, ваш пример:

if (0 <= X and X < 49) output "abc"

else if (50 <= X and X < 70) output "def"

else if (70 <= X and X < 85) output "ghi"

else if (85 <= X and X < 100) output "jkl"

endif

можно переписать как:

if (0 <= X and X < 49) output "abc"; return; end if

if (50 <= X and X < 70) output "def"; return; end if

if (70 <= X and X < 85) output "ghi"; return; end if

if (85 <= X and X < 100) output "jkl"; return; end if

// X < 0 or X >= 100

Комментарий:

Оператор if не должен быть вложенным в другой, если он вложен. Он может быть вложен в другое - Билл Ящерица

Точка взята; Я согласен, я ошибаюсь в этом.

...