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

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

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

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

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.

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 09:56 am
Powered by Dreamwidth Studios