avva: (Default)
[personal profile] avva
(только программистам интересно, наверное)

Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.

Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).

Есть какая-то глубокая причина этому?

Date: 2003-04-12 08:55 am (UTC)
From: [identity profile] 37.livejournal.com
Никогда не воспринимал это как проблему. Зависит от сложившегося стиля. Причина неиспользования break label и continue label чисто историческая и исправлена в новых языках, таких как Java или C#. Справеливости ради, если мне память не изменяет, существовала уже вместе с exceptions в IBM-овском PL/X накануне его безвременной кончины (break & loop с меткой, кажетсяи в rexx). Но таких мелких неудобств всегда довольно много. Вот, например, терпеть не могу, что декларация for(int i = 0;... в C++ носит открытый характер (действует и после завершения блока). Или это исправлено в последней версии стандарта? Оператор goto реализован во многих языках, но причина его неиспользования довольно очевидна. Кроме этой очевидной причины есть еще менее очевидные, вроде автоматической верификации программ, идея, с которой Дейкстра (и, кажется, наш Ершов) носился еще 25 лет назад, но примитивные элементы реализации которой я начал замечать только сейчас.

Date: 2003-04-12 11:59 am (UTC)
From: [identity profile] tejblum.livejournal.com
терпеть не могу, что декларация for(int i = 0;... в C++ носит открытый характер (действует и после завершения блока). Или это исправлено в последней версии стандарта?

Да, в стандарте это давно исправлено (стандарт был только один, в 1998 году кажется; драфты с этим исправлением появились еще раньше). Удивительно, что в MSVC это не только осталось "по старому", но даже и переключателя не появилось для "нового" поведения (во всяком случае так было до самого последнего времени) -- очень неудобно многоплатформенные программы писать.

Date: 2003-04-12 12:45 pm (UTC)
From: [identity profile] scolar.livejournal.com
Переключатель есть, однако. По крайней мере, в VC7(.NET):
/Zc:forScope

Date: 2003-04-12 01:56 pm (UTC)
From: [identity profile] tejblum.livejournal.com
Да, с "самым последним временем" я чуток погорячился: на VC7 мы пока, вроде, не перешли... Ну что же, хорошо что Microsoft наконец это исправил.

Re:

Date: 2003-04-12 02:11 pm (UTC)
From: [identity profile] 37.livejournal.com
То что осталось по-старому, не удивительно, потому что это изменение, которое автоматически делает кучу старых программ не компилируемыми (в отличие от расширяющего введения какой-нибудь новой директивы). О портабельности же, 100% за то, что они заботятся меньше всего на свете. Куча библиотечных функций underscored.

Date: 2003-04-12 03:04 pm (UTC)
From: [identity profile] tejblum.livejournal.com
То что осталось по-старому, не удивительно, потому что это изменение, которое автоматически делает кучу старых программ не компилируемыми (в отличие от расширяющего введения какой-нибудь новой директивы).

Это смотря как делать. Идея бинарного флажка-переключателя между старым и новым поведением просто очевидна. А в gcc, например, этот флажок тернарный: по умолчанию он компилирует и новые, и старые программы, выдавая warning на старый for scoping.

Отсутствие же такого флажка вообще, напротив, делает кучу новых программ некомпилируемыми :-)

О портабельности же, 100% за то, что они заботятся меньше всего на свете.
В общем согласен. Есть однако тонкости.

Куча библиотечных функций underscored.
Это обстоятельство явно отчасти вызвано излишне буквальной и тупой любовью к стандартам. Например, определение функции snprintf() в stdio.h явно нарушает ANSI C89; определение же там _snprintf() никакого стандарта не нарушает... По хорошему же единственное назначение стандартов -- это портабельность (а так можно было бы писать на VB или еще чем-нибудь домотканном). В области же формального соблюдения стандартов Microsoft вообще говоря не так уж и плох (полное следование всем формальностям вообще не так часто встречается...)

Date: 2003-04-12 03:33 pm (UTC)
From: [identity profile] anton.livejournal.com
стандарт был только один, в 1998 году кажется
Это как сказать, с тех пор вышло уже два technical corregendum, всё-таки.

Удивительно, что в MSVC это не только осталось "по старому", но даже и переключателя не появилось для "нового" поведения
В каком? Последний MSVC поддерживает стандарт чуть ли не лучше, чем все остальные вообще.

Date: 2003-04-12 08:56 pm (UTC)
From: [identity profile] 109.livejournal.com
> декларация for(int i = 0;... в C++ носит открытый характер (действует и после завершения блока).

не в С++, а в MSVC.

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 30th, 2025 02:11 pm
Powered by Dreamwidth Studios