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

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

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

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

Re:

Date: 2003-04-12 07:24 am (UTC)
From: [identity profile] avva.livejournal.com
В Джаве есть такой выход из вложенных циклов.

В C, по-моему, нет cleanup'а по двум причинам, в чём-то друг от друга зависящим: во-первых, железо начала 70-х (речь идёт не о мейнфреймах, конечно) его плохо поддерживало; во-вторых, C изначально был задуман как язык, в котором все переходы контроля абсолютно прозрачны для программиста. В C никогда ничего не происходит "за кулисами" с точки зрения выполнения каких-то команд. Именно поэтому сторонники других языков любят называть C макроассемблером, но, с другой стороны, это идеально подходит для системного кода, для realtime-кода, и вообще во всех случаях, когда программист должен более или менее чётко представлять, что происходит во время исполнения вот этой конкретной строки кода.

Структура динамического размера - да, было бы удобно, хотя это syntactic sugar, по сути дела.

Date: 2003-04-12 08:05 am (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
Я не language lawyer, но насколько я понимаю, написание кода, аналогичного структуре динамического размера невозможно в пределах стандарта ANSI C (например, стандарт не гарантирует того, что последнее поле в определении структуры будет последним в памяте).

Date: 2003-04-12 10:45 am (UTC)
From: [identity profile] tejblum.livejournal.com
например, стандарт не гарантирует того, что последнее поле в определении структуры будет последним в памяте.

Кажется, стандарт это всё же гарантирует, во всяком случае последний стандарт (т.н. C99). В C99 также есть и поддержка таких вот структур переменной длинны, с массивом неизвестного размера в качестве последнего элемента. Только память выделять надо так: malloc(sizeof(nametable_t) + 100*sizeof(nametable->names[0])). В gcc 3.1 это даже работает.

Date: 2003-04-12 11:02 am (UTC)
From: [identity profile] oblomov-jerusal.livejournal.com
Ну примерно так я всегда писал, только стандартно ли это? Мне кажется более стандартным (но не стандартным) вариантом malloc(offsetof(nametable_t, names) + 100 * sizeof(nametable->names[0]));

Date: 2003-04-12 11:19 am (UTC)
From: [identity profile] tejblum.livejournal.com
Я же говорю: в C99, то есть в стандарте C от 1999 года, стандартно можно не указывать размер последнего поля-массива в структуре. В старом стандарте С (от 1989 года) можно было у последнего массива указывать размер 1 и писать offsetof; это абсолютно стандартно, и продолжает быть стандартным в C99.

Date: 2003-04-12 11:04 am (UTC)
From: [identity profile] tejblum.livejournal.com
Первые версии C++, до появления exceptions (но с конструкторами, деструкторами и виртуальными функциями) вполне можно считать тем же макропроцессором (а cleanup, который хотел [livejournal.com profile] oblomov_jerusal -- это и есть деструктор). Темплейты этой макропроцессорности тоже не мешают. Эта черта языка мне очень нравится.

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
2829 3031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

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