Форум » » ELSEIF в многострочных IF » Ответить

ELSEIF в многострочных IF

Byte: В следующей версии планируется поддержка ELSEIF в многострочных IF. При разработке возникла следующая ситуация: Хочется, чтобы "ELSE IF" (с пробелом) воспринимался аналогом ELSEIF, но тогда возникает ситуация, когда "ELSE IF" при чтении кода может быть воспринят как отдельно "ELSE" и отдельно "IF": [pre2] a=4 if a=1: 'a is 1' elseif a=2: 'a is 2' else if a=9: 'a is 9' else if a=3:'a is 3' else 'a' 'test' end[/pre2] Как воспринимается данный код? Что должно быть выведено? Собственно, разница между ELSEIF и ELSE веткой в том, что ELSE ветка будет выполняться в случае, когда ни один из вышестоящих ELSEIF не был выполнен. А "ELSEIF" при неверном условии перейдет к следующему "ELSE/ELSEIF". PS: После "ELSE" можно будет, как и прежде, ставить двоеточие - для удобства.

Ответов - 16

Olegus t.Gl.: Восприниматься будет примерно так: [pre2] a=4 if a=1: 'a is 1' elseif a=2: 'a is 2' else if a=9: 'a is 9' else if a=3:'a is 3' else 'a' 'test' end [/pre2] Может, конечно, я недостаточно идеологию однострочных/многострочных конструкций понимаю…

Byte: Olegus t.Gl., там такой вложенности не может быть, то есть однострочные / многострочные формы if нельзя смешивать..

Byte: Если убрать "ELSE IF" как синоним ELSEIF, то строчка [pre2] else if a=9: 'a is 9' [/pre2] будет означать "если ни одно из условий elseif выше не было выполнено (т.е. ветка ELSE), то выполнить "if a=9:". 'a is 9' выполняться уже не будет, т.к. находится на другой строке.

Byte: Вопрос отпадает: посмотрел QBASIC - там ELSE IF воспринимается именно как "ELSE" с оператором "IF". Делаю точно также.

Nex: Byte т.е. в QBASIC, код [pre2] IF condition1 THEN ... ELSE IF condition2 THEN ... END [/pre2] равнозначен следующему: [pre2] IF condition1 THEN ... ELSE IF condition2 THEN ... END END [/pre2] ?

Ntropy: Как я понял схемка if elseis else end аналогична switch case case default [pre2] a=4 if a=1: | 'a is 1' | elseif a=2: | 'a is 2' | else if a=9: | 'a is 9' | else if a=3:'a is 3' else | 'a' | 'test' end [/pre2] Если же запретить else if как синоним elseif то тот же код будет обрабатываться иначе и нужно дополнять его end'ами. ну в концовке я не очень уверен. [pre2] a=4 if a=1: | 'a is 1' | elseif a=2: | 'a is 2' else if a=9: | | 'a is 9' | else if a=3:'a is 3' | | else | | | 'a' | | | 'test' | | end | end end [/pre2]

Nex: Ntropy результат получается один и тот же.

Byte: Nex [pre2] IF condition1 THEN ... ELSE IF condition2 THEN ... END [/pre2] Такой код в QBASIC вообще запрещен - если записано ELSE IF (с пробелом), то после THEN обязательно должен идти какой-то код - эта форма не может быть многострочной. Но суть такая, как ты написал - ELSE IF воспринимается как ELSE <какой-то код> - после выполнения мы сразу переходим на END всего условия.

Byte: Ntropy, всё не так

Byte: Будет сообщение об ошибке.

hitecnologys: Народ, а не проше сделать просто switch?

Nex: hitecnologys у elseif больше возможностей.

HIman: ИМХО :) Бинарное мышление :) У условия 2 состояние 1 или 0 (истина или лож) и другого не дано не надо. Бинарность реализуется: IF условие истина ELSE лож END Все остальное CASE также просто и наглядно. Если не подходит CASE 2 ИФА подрят 3 ИФА подрят Даже можно ИФ в ИФЕ :) Но делать 3, 4, 5 уровень вложенности только нагромождение логических ошибок. На будущее: чем завернутее будет написан IF, тем сложнее будет разобрать код.

Ntropy: hitecnologys за основу взят язык Basic поэтому IF|ELSEIF, P.S. самый удобный и навороченный switch на мой взгляд в JavaScript и вот он может сравниться с elseif по удобству, поскольку там в case'ах могут быть не константы, а любые произвольные выражения разного типа, а С'шный — нет.

Nex: HIman в том-то и дело, что "уровня вложенности" нет. Вложенные IF всегда можно было писать, а ELSEIF предназначен для перебора ситуаций на одном уровне.

Ntropy: Byte Стоит поправить пример, текущий код (особенно else if) вроде бы не должен правильно исполняться.



полная версия страницы