Вопрос по реализации Else If - PullRequest
3 голосов
/ 12 ноября 2010

Я задавался вопросом о реализации else if if, в частности, зачем нужны два ключевых слова и почему они не объединены. В Python elif используется как оператор потока управления else if. Мне было интересно, как общий компилятор будет интерпретировать еще, если.

Обрабатывает ли компилятор что-то еще, если это как один токен? Или просто if, просто else с неявной областью блоков, которая переходит в if underneath?

Один токен:

if (some_condition) {
    some_statement();
}
else_if (some_other_condition) {
    other_statement();
}
else {
    default_statement();
}

Или иначе, если:

if (some_condition) {
    some_statement();
}
else { // compiler generated block scope 
    if (some_other_condition) {
         other_statement();
    }
    else {
        default_statement();
    }

}

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

Ответы [ 6 ]

8 голосов
/ 12 ноября 2010

В C, по крайней мере, else if не является отдельной языковой конструкцией.Как вы уже догадались, он ничем не отличается от if (x) { ... } else { if (y) { ... } }.

В некоторых языках (и, вероятно, Python является одним из них), тогда правила синтаксиса / пробелов не позволят синтаксическому анализатору правильно интерпретировать else if, поэтомуelif (или эквивалентная) конструкция.

5 голосов
/ 12 ноября 2010

В C грамматика оператора if выглядит просто:

if (expression) statement [else statement]

A оператор может быть оператором блока , который выглядит следующим образом::

{ statement-list }

но это не обязательно.Так что в случае «иначе, если», это просто ключевое слово else, за которым следует один оператор, и этот оператор оказывается оператором if.

Концептуально, он такой же, как этот:

if (x == 0) {
    return;
} else while (x > 0) {
    foo(x--);
}

"else if" не обрабатывается иначе, чем "else while" или любой другой подобной конструкции.

3 голосов
/ 12 ноября 2010

В C else if - это два ключевых слова, и следующие по сути одинаковые:

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

и

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

«else if» не является специальным, по крайней мерене в С.

2 голосов
/ 12 ноября 2010

Раздел 8.7.1 спецификации языка C # (4.0) показывает, что грамматика для оператора if просто:

if (boolean-expression) embedded-statement else embedded-statement

Таким образом, он анализирует else if как else, за которым следует оператор if. Это поведение эмулирует поведение C и C ++.

2 голосов
/ 12 ноября 2010

Я предполагаю, что есть некая парантез, окружающий оператор if.

Многое, как вы можете написать

if(x==1)
   System.Console.WriteLine("1");
else
   System.Console.WriteLine("2");

вместо

if(x==1)
{
   System.Console.WriteLine("1");
}
else
{
   System.Console.WriteLine("2");
}

Остальноеif (cond) {action} нотация, как вы описали, является сокращением для else {if (cond) {action}}

. Для удобства чтения парантез опущен.

if(x==1)
{
   System.Console.WriteLine("1");
}
else
{
   if (x==2)
   {
       System.Console.WriteLine("2");
   }
}

Isтруднее следовать, чем

if(x==1)
{
   System.Console.WriteLine("1");
}
else if(x==2)
{
    System.Console.WriteLine("2");
}
1 голос
/ 12 ноября 2010

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

Например:

if (a) {
    ...
} else if (b) {
    ....
} else {
    .....
}

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

if (a) {
    ...
} else {
    if (b) {
        ....
    } else {
        .....
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...