ElseIf vs Else If

Уже много лет я используюElse If кодировать в VBScript ...

If a = b Then
    ...
Else If a = c Then
    ...
End If

Который, кажется, работает как требуется. Я также видел много сайтов в Интернете, которые используютElse Ifза исключением MSDN, который используетElseIf.

Есть ли разница междуElseIf противElse If?

отрывок

Вот тот код, который я написал ранее, и он прекрасно работает через Classic ASP:

If IsDate(wD) Then
    wS = wD
Else If wD&"" <> FormatDisplayDate(wS) Then
    wS = WeekStart(Date())
    wD = FormatDisplayDate(wS)
End If

Вот фрагмент старого кода, написанный кем-то другим ...

if opip = "IP" then
    opip = "In Patient"
Else If opip = "OP" then
    opip = "Out Patient"
End If

Ни один из них не запускается через компилятор, однако, все это интерпретируется.

Проигнорируйте это барахло - я перепутал поиск и замену в IDE.

 Lankymart18 июл. 2016 г., 17:04
Нечестно @EricLippert, вы действительно разработали компилятор! : p Это todo с сокращениемIf не понимая, что ониSubs? Это работаетIf x Then Call foo Else Call bar.
 Paul18 июл. 2016 г., 17:15
@Lankymart: Да - это в основном то, что я говорил.
 Lankymart18 июл. 2016 г., 17:09
@EricLippert Я склонен использоватьCall при звонкеSub процедуры, так что я никогда не сталкивался с этой ошибкой, я чувствую, что я узнал кое-что сегодня. Спасибо.
 Eric Lippert18 июл. 2016 г., 17:01
@Paul: ОК, попробуйте! Смотрите, если вы удивлены.
 Eric Lippert18 июл. 2016 г., 17:06
@Lankymart: Правильно! В одной строке есть ошибкаIf парсер который я никогда не исправлял. Пытается разобратьFoo Else как утверждение и провал, а не обнаруживая, чтоElse завершает оператор после одиночного токенаFoo, Нет веской причины, по которой он никогда не был исправлен, за исключением того факта, что он просто не был признан высокоприоритетным вопросом.
 Paul18 июл. 2016 г., 17:22
Обидно, что нетClose this thread because I'm an idiot вариант в списке.
 Eric Lippert18 июл. 2016 г., 16:56
Меня тоже смущает этот вопрос; Можете ли вы предоставить фрагмент кода, который на самом деле компилируется и запускается, что демонстрирует вашу проблему?
 Paul20 июл. 2016 г., 14:24
@EricLippert: Ух ты! Приятно иметь поддержку от Мужчина! : О)
 user601777420 июл. 2016 г., 03:42
В спецификациях VBA я не помню, чтобыgoto а такжеgo to так же какgosub а такжеgo sub, Я никогда не ставил пробел после Го
 user601777419 июл. 2016 г., 14:10
@Lankymart WordBasic Ver 2 принимаетEndIf или жеEnd If следовательно VB6 автокоррекция. Человек помнитEndIf неElseIf. QBasic также автоматически исправляетEndIf вEnd If но нетElse If.
 Eric Lippert18 июл. 2016 г., 17:08
Уверяю вас, VBScript, работающий в Classic ASP, скомпилирован; он компилируется на проприетарный недокументированный язык байт-кода, который затем интерпретируется.
 Lankymart18 июл. 2016 г., 17:01
@ Пол, похоже, нет ...Microsoft VBScript compilation error: Syntax error.
 Paul20 июл. 2016 г., 14:21
@Noodles:EndIf а такжеEnd If не имею ничего общего с этим вопросом - я отправил сообщение, потому что мне пересекли мои провода (прочитайте мои последние комментарии до этого). Что касается VBA, то это фактически связано с IDE, а не с языком. Я думаю, что если вы попытались заставитьEndIf через компилятор у тебя будут проблемы.
 Eric Lippert18 июл. 2016 г., 16:58
До тех пор, забавная диверсия: предсказать, будет ли эта однострочнаяIf заявление должно компилироваться, учитывая, что естьsubs Foo а такжеBar и булево выражениеX: If X Then Foo Else Bar, Любые эксперты по VBScript хотят попробовать?
 Paul18 июл. 2016 г., 16:59
@EricLippert: Да, это должно работать. Я использовал подобные выражения раньше.
 Paul18 июл. 2016 г., 17:10
@EricLippert: Это также должно разрешить, в том случае, когда между утверждениями If и Else вводится двоеточие, однако это действительно делает его двухстрочным.
 Lankymart18 июл. 2016 г., 16:42
Как @ Ekkehard.Horner сказал, что не получится, вы получитеMicrosoft VBScript compilation error: Expected 'End', так вы уверены, что используется правильный синтаксис? Единственный способ, который будет работать, это если вы добавите дополнительныйEnd If ниже существующегоEnd If который в основном меняетElse во вложенныйIf что не одно и то же.
 user601777419 июл. 2016 г., 07:25
@EricLippert @lankymart В VB6 есть автокоррекция (afaik единственное автозамена) дляEndIf меняется наEnd If.
 Paul18 июл. 2016 г., 17:20
Ой! Мужчина! Знаете что - я чувствую себя таким идиотом. Недавно я переключался между несколькими разными языками, и я просто думаю о JavaScript. Клянусь, я теряю шарики! Извините за усилия, которые вы все приложили, но все равно спасибо. @ Ekkehard.Horner, LEric Lippert и Lankymart, вы, конечно, абсолютно правы.
 user601777419 июл. 2016 г., 15:10
Он помнит старые основы (в том числе VBA), которые приняли или исправилиEndIf (но нетElseIf). Это сводило меня с ума, что VBS только принялEnd If после десятилетий вводаEndIf, VBS является первым базовым, который не позволяетEndIf, Мы также можем спросить @EricLippert, как он пропустил это из спецификации VBALINE-START (("End" "If") / "EndIf").
 Eric Lippert19 июл. 2016 г., 17:55
@Noodles: Во-первых, первоначальная реализация VBScript была уже сделана, когда я присоединился к команде, так что это был не мой вызов. Принцип дизайна, который мы определили, заключался в том, что, поскольку не было редактора VBScript с автокоррекцией, мы быне принять код, который редактор VBA будет автоматически корректировать; мы принимаем только правильный код. Если «EndIf» является законным и не исправлен автоматически в VBA - я не помню - тогда, вероятно, это был просто недосмотр. Первоначальный синтаксический анализатор для VBScript был создан очень быстро, и многие мелкие детали, подобные этому, так и не были реализованы.
 Ekkehard.Horner18 июл. 2016 г., 16:38
Код, который вы опубликовали, не компилируется. Поэтому мне интересно, что ты делал все эти годы.
 Lankymart19 июл. 2016 г., 15:04
@ Лапша, о чем ты? Извините, что вы потеряли меня, я думал, что мы говорим о VBScript.
 Paul18 июл. 2016 г., 17:04
Отсутствует: передElse.
 Lankymart18 июл. 2016 г., 17:14
@Paul это не просто преобразовать его в нормальныйIf в отличие от стенографииIfтак баг не покажет?

Ответы на вопрос(2)

Else If кладет вложенныйIf внутриElse ветка перваяIf заявление тогда какElseIf является частью первоначальногоIf заявление.

В основном это два двухсторонних условия (одно вложено в другое)

If condition Then
  ...
Else
  If condition Then
    ...
  Else
    ...
  End If
End If

против одного n-way условного

If condition Then
  ...
ElseIf condition Then
  ...
Else
  ...
End If

И в качестве@ Ekkehard.Horner указал, что первый должен выдавать ошибку без закрытия вложенногоEnd If.

Решение Вопроса

Ошибка компиляции Microsoft VBScript: ожидаемое окончание

как я и ожидал(как@ Ekkehard-горнист указать в комментариях).

Я никогда не зналElseIf работать любым другим способом, топодробно в MSDN, Единственное, о чем я могу думать, это то, что ты пишешь это как вложенныйIf заявление.

If a = b Then
    ...
Else If a = c Then
    ...
End If
End If

который выглядит действительно некрасиво, но так же, как писать

If a = b Then
    ...
Else
    If a = c Then
        ...
    End If
End If

Проблема с этим подходом заключается в том, что у вас возникает необработанное условие на вложенномIf заявление. Что будет еслиa = d например?

Вы должны убедиться, что ваш вложенныйIf поймал дополнительное состояние, которое не нужно сElseIf заявление.

If a = b Then
    ...
Else
    If a = c Then
        ...
    Else
        ...
    End If
End If

ElseIf подход будет;

If a = b Then
    ...
ElseIf a = c Then
    ...
Else
    ...
End If

Интересные размышления от@ Эрик-Lippert (один из программистов за компилятором VBScript) в море комментариев ... стоит прочитать. Я конечно кое-что узнал.

Ваш ответ на вопрос