Является ли "else if" языковой конструкцией или следствием того, как компилятор обрабатывает конструкцию if / else? - PullRequest
0 голосов
/ 15 октября 2019

if/else операторы гибки в своем приемлемом синтаксисе. В таких языках, как C #, исполняемый код может находиться в той же строке, что и проверка условий, или в новой строке, с отступом или без, в фигурных скобках или нет. Эта гибкость ставит вопрос о том, является ли блок else if фактической языковой конструкцией вообще или просто результатом гибкости if/else операторов.

Рассмотрим этот код:

// Version 1
if (condition1)
  // do something
else if (condition2)
  // do something else
else
  // do some third thing

Этот код может быть переписан таким образом, что он синтаксически отличается, но семантически идентичен:

// Version 2
if (condition1)
  // do something
else
{
  if (condition2)
    // do something else
  else
    // do some third thing
}

Скобки, окружающие блок else, являются необязательными, поскольку if/else считается одним оператором для скобок. цели использования, поэтому еще одна семантически идентичная итерация была бы:

// Version 3
if (condition1)
  // do something
else
  if (condition2)
    // do something else
  else
    // do some third thing

Разумеется, между версией 1 и версией 3 нет заметного различия, поскольку C # не учитывает пробелы. Естественный вопрос заключается в том, является ли else if реальной функцией, встроенной в C # (или языки семейства C в целом), или просто полезным следствием гибкого синтаксиса, который умные разработчики программного обеспечения обнаружили давно.

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

1 Ответ

2 голосов
/ 15 октября 2019

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

else, if, (condition) и action(); могут быть записанына одну, две, три или четыре строки;его легче читать, и он занимает меньше места по вертикали, чтобы поместить их все в одну или две строки.

Отступы также необязательны, но я включил их для удобства чтения.

Интересно (по крайней мере для меня), первый пример с 9 строками и последний пример с 1 строкой труднее всего читать.

Лично я предпочитаю третий пример второму, потому что опасно иметь один оператор после if без заключенных в скобки фигурных скобок (поскольку, если бы была добавлена ​​еще одна строка, она не была бы выполнена условно).

Пример 1 (9 строк)

if
    (condition1)
    DoSomething();
else
if
    (condition2)
    DoSomethingElse();
else
    DoAThirdThing();

Пример 2 (6 строк)

if (condition1) 
    DoSomething();
else if (condition2) 
    DoSomethingElse();
else 
    DoAThirdThing();

Пример 3 (3 строки)

if (condition1) DoSomething();
else if (condition2) DoSomethingElse();
else DoAThirdThing();

Пример 4 (1 строка)

if(condition1)DoSomething();else if(condition2)DoSomethingElse();else DoAThirdThing();

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

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