глупый программистский вопрос
Apr. 12th, 2003 03:04 pm(только программистам интересно, наверное)
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
no subject
Date: 2003-04-12 08:55 am (UTC)no subject
Date: 2003-04-12 11:59 am (UTC)Да, в стандарте это давно исправлено (стандарт был только один, в 1998 году кажется; драфты с этим исправлением появились еще раньше). Удивительно, что в MSVC это не только осталось "по старому", но даже и переключателя не появилось для "нового" поведения (во всяком случае так было до самого последнего времени) -- очень неудобно многоплатформенные программы писать.
no subject
Date: 2003-04-12 12:45 pm (UTC)/Zc:forScope
no subject
Date: 2003-04-12 01:56 pm (UTC)Re:
Date: 2003-04-12 02:11 pm (UTC)no subject
Date: 2003-04-12 03:04 pm (UTC)Это смотря как делать. Идея бинарного флажка-переключателя между старым и новым поведением просто очевидна. А в gcc, например, этот флажок тернарный: по умолчанию он компилирует и новые, и старые программы, выдавая warning на старый for scoping.
Отсутствие же такого флажка вообще, напротив, делает кучу новых программ некомпилируемыми :-)
О портабельности же, 100% за то, что они заботятся меньше всего на свете.
В общем согласен. Есть однако тонкости.
Куча библиотечных функций underscored.
Это обстоятельство явно отчасти вызвано излишне буквальной и тупой любовью к стандартам. Например, определение функции snprintf() в stdio.h явно нарушает ANSI C89; определение же там _snprintf() никакого стандарта не нарушает... По хорошему же единственное назначение стандартов -- это портабельность (а так можно было бы писать на VB или еще чем-нибудь домотканном). В области же формального соблюдения стандартов Microsoft вообще говоря не так уж и плох (полное следование всем формальностям вообще не так часто встречается...)
no subject
Date: 2003-04-12 03:33 pm (UTC)Это как сказать, с тех пор вышло уже два technical corregendum, всё-таки.
Удивительно, что в MSVC это не только осталось "по старому", но даже и переключателя не появилось для "нового" поведения
В каком? Последний MSVC поддерживает стандарт чуть ли не лучше, чем все остальные вообще.
no subject
Date: 2003-04-12 08:56 pm (UTC)не в С++, а в MSVC.