глупый программистский вопрос
Apr. 12th, 2003 03:04 pm(только программистам интересно, наверное)
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
Почему в процедуральных языках, как правило, нет оператора досрочного выхода из блока? Как break в C, но чтобы работал не только из циклов, а также внутри if-then или вообще любого блока.
Постоянно приходится делать глупые вложенные цепочки условий или некрасивые трюки типа while(1) и выполза по break'у (ну или, понятно, их аналоги в других языках).
Есть какая-то глубокая причина этому?
Re:
Date: 2003-04-12 07:24 am (UTC)В C, по-моему, нет cleanup'а по двум причинам, в чём-то друг от друга зависящим: во-первых, железо начала 70-х (речь идёт не о мейнфреймах, конечно) его плохо поддерживало; во-вторых, C изначально был задуман как язык, в котором все переходы контроля абсолютно прозрачны для программиста. В C никогда ничего не происходит "за кулисами" с точки зрения выполнения каких-то команд. Именно поэтому сторонники других языков любят называть C макроассемблером, но, с другой стороны, это идеально подходит для системного кода, для realtime-кода, и вообще во всех случаях, когда программист должен более или менее чётко представлять, что происходит во время исполнения вот этой конкретной строки кода.
Структура динамического размера - да, было бы удобно, хотя это syntactic sugar, по сути дела.
no subject
Date: 2003-04-12 08:05 am (UTC)no subject
Date: 2003-04-12 10:45 am (UTC)Кажется, стандарт это всё же гарантирует, во всяком случае последний стандарт (т.н. C99). В C99 также есть и поддержка таких вот структур переменной длинны, с массивом неизвестного размера в качестве последнего элемента. Только память выделять надо так: malloc(sizeof(nametable_t) + 100*sizeof(nametable->names[0])). В gcc 3.1 это даже работает.
no subject
Date: 2003-04-12 11:02 am (UTC)no subject
Date: 2003-04-12 11:19 am (UTC)no subject
Date: 2003-04-12 11:04 am (UTC)