Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, _hum_, Вы писали:
BFE>>>на всякий случай, а то ещё скажите, что не видели: __>>это я совсем не понял, к чему вы привели. что за жах?
BFE>Если на него посмотреть, то можно предположить, почему switch-case такой, какой он есть. — это с одной стороны.
вот, честно, даже в голову не приходит, каким боком там должна проскакивать тема swith (и зачем вообще while(false)? может, while(true) для бесконечного цикла?)
O>>ну, скажем for имеет совсем-совсем не такую семантику как while. И в каком-то особенно философском смысле for отличается от while как switch от if/else. __>вот и я так ожидал, что "for отличается от while как switch от if/else", то есть, что первое является разновидностью синтаксического сахара второго (ведь for(<stat>_0; <condition>; <stat>_1){<body>} равносильно <stat>_0; while(<condition>){<body>; <stat>_1} ), а оказалось все не так
фор в отличие от вайла допускает отсутствие любой своей части, вплоть до
for (;;)
что кстати многие, включая меня, считают более адекватным выражением бесконечного цикла нежели while(1)
O>>Я кстати пред сообщение подкрепил примером. __>ну, как бы да, для меня это пример из области программирования на "высокоуровневом ассемблере".
Просто чтото о чем вы не знали и внезапно узнали. Впрочем двоеточия после case'ов и тот факт что case'ы не приемлют ничего кроме констант как бы намекают на то, что они на метки больше похожи чем на if'ы и вообще сделано оно для облегчения оптимизатору строить оптимизированные таблицы переходов в подходящих дла того местах...
Здравствуйте, _hum_, Вы писали:
__>вот, честно, даже в голову не приходит, каким боком там должна проскакивать тема swith (и зачем вообще while(false)? может, while(true) для бесконечного цикла?)
А так?
do// switch(data)
{ // {if ( data == 1 ) // case 1:
{ //
cout << '1'; // cout << '1';break; // break;
} // if ( data == 2 ) // case 2:
{ //
cout << '2'; // cout << '2';break; // break;
} //
... // if ( data == 3 ) // case 3:
{ //
cout << '3'; // cout << '3';break; // break;
} //
} // }while(false); //
Здравствуйте, _hum_, Вы писали:
__>ну так, если switch на деле — это завуалированный goto с динамическим выбором метки перехода, то тогда понятно, почему такие извраты на его основе появляются — фактически идет программирование на ассемблере.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, _hum_, Вы писали:
__>>вот, честно, даже в голову не приходит, каким боком там должна проскакивать тема swith (и зачем вообще while(false)? может, while(true) для бесконечного цикла?)
BFE>А так? BFE>
Здравствуйте, Don Reba, Вы писали:
DR>Здравствуйте, _hum_, Вы писали:
__>>ну так, если switch на деле — это завуалированный goto с динамическим выбором метки перехода, то тогда понятно, почему такие извраты на его основе появляются — фактически идет программирование на ассемблере.
DR>Ну, да. Весь С тонкая обёртка над ассемблером.
я в курсе, что си — это "высокоуровневый ассемблер". меня другое смутило, что
1) семантика switch оказалась не такой естественной, как думалось
2) нигде в литературе я не видел, чтобы кто-то обращал на это внимание (соответственно, я только теперь столкнулся с этим)
3) в с++ продолжают протаскивать switсh на равных правах c if, а не как "тяжкое наследие си" (как,например, goto).
O>фор в отличие от вайла допускает отсутствие любой своей части, вплоть до O>
for (;;)
что, согласитесь, нельзя отнести к "совсем-совсем другой семантике" (по сравнению с while).
O>что кстати многие, включая меня, считают более адекватным выражением бесконечного цифра нежели while(1)
а по мне, так while(true) более естественно выглядит, чем пустое условие в for (;)
O>>>Я кстати пред сообщение подкрепил примером. __>>ну, как бы да, для меня это пример из области программирования на "высокоуровневом ассемблере". O>Просто чтото о чем вы не знали и внезапно узнали. Впрочем двоеточия после case'ов и тот факт что case'ы не приемлют ничего кроме констант как бы намекают на то, что они на метки больше похожи чем на if'ы и вообще сделано оно для облегчения оптимизатору строить оптимизированные таблицы переходов в подходящих дла того местах...
O>Чтонить банальнохитрое типа: O>
O>>фор в отличие от вайла допускает отсутствие любой своей части, вплоть до O>>
for (;;)
__>что, согласитесь, нельзя отнести к "совсем-совсем другой семантике" (по сравнению с while). O>>что кстати многие, включая меня, считают более адекватным выражением бесконечного цифра нежели while(1) __>а по мне, так while(true) более естественно выглядит, чем пустое условие в for (;)
Ну, если считать что бесконечный цикл — это такой цикл у которого нет условия выхода — то for(;) логичнее, ибо в нем реально нет условия выхода. А while(true) — это цикл с условием выхода, которое просто бесконечно не выполняется.
Кстати отличия switch от if дае глубже чем просто проваливающиеся бряки. Бряков в нем может быть много, даже без проваливания:
O>>..с применением вайла будет выглядеть, примерно настолько же понятнее как многоэтажный switch-case переделанный на ифы. Но и настолько же длиннее. __>это пример кода, который уважаемые люди рекомендуют никогда не писать, если только вы не собираетесь больше никогда его не сопровождать в дальнейшем.
Ну да, в отличии от многоэтажных кейсов так я почти никогда не пишу, только если очень тороплюсь
Как много веселых ребят, и все делают велосипед...
__>только я все равно ен понял, к чему вы привели соттветствующий код.
Это к тому, что обычно смотришь на код и думаешь: "какой дурак его написал?". А всё почему? А потому, что для одного хорошо, для другого — извращение. И наоборот. Как написано в книжке "Рабы Майкрософта" — "красота — в глазах смотрящего". __>чтобы показать, что со свитчем он проще?
А разве он проще?
__>>зачем такая неочевидная и "техническая" семантика? ARK>Язык Ц криво спроектирован, вот и все.
Язык Ц проектировался с минимально необходимым для обеспечения непротиворечивости конструкций множеством ограничений, а не для облегчения понимания шаблонно мыслящим.
ARK>Там еще есть всякие дебильные штуки, типа эквивалентности a[i] и i[a].
Это в вас говорит отсутствие чувства прекрасного в симметрии.
Как много веселых ребят, и все делают велосипед...
Здравствуйте, _hum_, Вы писали:
__>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?
Не знаток, поэтому вместо ответа на вопрос затокам дам совет.
В принципе стоит изучать хотя бы основные конструкции ЯП, перед тем, как пластать код...
В случае С это удобно сделать по этой книжке...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, ononim, Вы писали:
__>>>зачем такая неочевидная и "техническая" семантика? ARK>>Язык Ц криво спроектирован, вот и все. O>Язык Ц проектировался с минимально необходимым для обеспечения непротиворечивости конструкций множеством ограничений, а не для облегчения понимания шаблонно мыслящим.
Ерунда. break в свитче не обоснован ничем. Это просто кривость и источник ошибок.
ARK>>Там еще есть всякие дебильные штуки, типа эквивалентности a[i] и i[a]. O>Это в вас говорит отсутствие чувства прекрасного в симметрии.
Вот уж у кого не было чувства прекрасного, так это у создателей Ц.
__>>>>зачем такая неочевидная и "техническая" семантика? ARK>>>Язык Ц криво спроектирован, вот и все. O>>Язык Ц проектировался с минимально необходимым для обеспечения непротиворечивости конструкций множеством ограничений, а не для облегчения понимания шаблонно мыслящим. ARK>Ерунда. break в свитче не обоснован ничем. Это просто кривость и источник ошибок.
if-ы оставьте if-ам вместе с else-ами. switch без break уныл и не нужен. break в свиче — это просто выход из тела свича, case — просто метки на переходы. Очень удобно, но разумеется не тем кто привык городить многоэтажные if'ы:
void commit_records_or_die(int how, const record *recs, size_t count)
{
size_t i;
struct stat s;
const record *tmp;
switch (how)
{
case OVERWRITE:
ftruncate(fd, 0);
lseek(f, 0, SEEK_END);
case APPEND:
for (i = 0; i<count; ++i)
{
if (write(fd, recs + i, sizeof(*rec))<=0) break;
}
if (i==count) break;
fstat(fd, &s);
ftruncate(f, s.st_size - i * sizeof(*recs));
lseek(f, 0, SEEK_END);
case POSTPONE:
tmp = realloc(global_postponed_records, (global_postponed_count + count) * sizeof(*recs));
if (!tmp) abort();
memcpy(tmp + global_postponed_count, recs, count * sizeof(*recs));
global_postponed_count+= count;
global_postponed_records = tmp;
break;
default:
printf("don't know how: 0x%x\n", how);
}
ARK>>>Там еще есть всякие дебильные штуки, типа эквивалентности a[i] и i[a]. O>>Это в вас говорит отсутствие чувства прекрасного в симметрии. ARK>Вот уж у кого не было чувства прекрасного, так это у создателей Ц.
Прелесть С в том что он базируется на минимуме концепций. Соответственно он хорош для понимания теми кто, привык оперировать на уровне логических цепочек, строящихся на минимальном базисе, а не на уровне заученных конструкций. Последним это причиняет неудобство потому, что они пытаются вместо постройки ментальной модели того как эти базисы могут взаимодействовать — пытаются заучить наизусть все возможные комбинации базисов, которых оказывается чрезвычайно много, и случается ментальный overflow.
Как много веселых ребят, и все делают велосипед...
_ O>Прелесть С в том что он базируется на минимуме концепций. Соответственно он хорош для понимания теми кто, привык оперировать на уровне логических цепочек, строящихся на минимальном базисе, а не на уровне заученных конструкций. Последним это причиняет неудобство потому, что они пытаются вместо постройки ментальной модели того как эти базисы могут взаимодействовать — пытаются заучить наизусть все возможные комбинации базисов, которых оказывается чрезвычайно много, и случается ментальный overflow.
то, о чем вы говорите (минимум базовых конструкций) — это простота языка. а есть еще экспрессивность (выразительность) — возможность в наиболее естественной для человеческой мысли форме изложить в языке задумку.
так вот они друг другу противоречат. самым простым языком является машинный (а если речь про теоретический — то язык лямбда-исчисления), но в то же время он самый невыразительный. языки высокого уровня потому и появились и размножились, что выразительность оказалась важнее (и в каждой области стараются по максимуму ее выжать за счет приемлемой жертвы простотой).
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, _hum_, Вы писали:
__>>а можно и так: BFE>Нельзя. При data == 4 цикл никогда не закончится. (в отличии от)
да в вашем примере то же самое (если считать, что вы описались, и нужно while(true), а не while(false))
но дело же не в этом. я не мог понять, каким боком это относится к обсуждаемой теме
__>>только я все равно ен понял, к чему вы привели соттветствующий код. BFE>Это к тому, что обычно смотришь на код и думаешь: "какой дурак его написал?". А всё почему? А потому, что для одного хорошо, для другого — извращение. И наоборот. Как написано в книжке "Рабы Майкрософта" — "красота — в глазах смотрящего".
кхм.. а почему тогда сопроводили свой пример текстом "на всякий случай, а то ещё скажите, что не видели: "? обычно такой коммент постят к "каноническим" вещам, которые не знать стыдно...
__>>чтобы показать, что со свитчем он проще? BFE>А разве он проще?
да, места меньше занимает (нет кучи сравнений и скобок)
Здравствуйте, ononim, Вы писали:
O>switch без break уныл и не нужен.
Ну да, вероятно именно поэтому такой прекрасной конструкции нет ни в одном языке, кроме Ц/Ц++.
O>break в свиче — это просто выход из тела свича, case — просто метки на переходы. Очень удобно, но разумеется не тем кто привык городить многоэтажные if'ы:
Случаи, когда это удобно, можно по пальцам пересчитать, по сравнению со случаями, когда это неудобно. И мало того, что неудобно, так еще и скрытые ошибки провоцирует.
O>Прелесть С в том что он базируется на минимуме концепций. Соответственно он хорош для понимания теми кто, привык оперировать на уровне логических цепочек, строящихся на минимальном базисе, а не на уровне заученных конструкций.
Да нет, это не вполне верно. Ц, конечно, маленький язык, но при этом далеко не везде последовательный. К примеру, можно взглянуть на расположение звездочки при объявлении указателей.
И никакого "минимума концепций" там нет, просто создатели сделали язык, как им казалось правильным. Местами получилось удачно, местами не особо.
Здравствуйте, T4r4sB, Вы писали:
CEM>>Как мне думается, были рассмотрены всевозможные варианты разбора ветвлений, самый часто используемый был реализован самым простым синтаксисом.
TB>Это так нормальные языки проектируют. TB>Но к сишке это не относится. Вообще процесс её появления нельзя называть словом "проектировать", к сишке можно отнести только слово "была высрана".
Тарас, вот ты задолбал...
Не нравится — не пиши на сях, никто не в обиде. Зачем в тематический форум вываливать свои субъективные проблемы?
Если знаешь, как надо: поговори с автором или напиши свою альтернативу с++. Если это будет удобнее и лучше, я перейду на неё. Только не надо больше неконструктивной ругани.
Здравствуйте, CEMb, Вы писали:
CEM>Тарас, вот ты задолбал... CEM>Не нравится — не пиши на сях, никто не в обиде. Зачем в тематический форум вываливать свои субъективные проблемы? CEM>Если знаешь, как надо: поговори с автором или напиши свою альтернативу с++. Если это будет удобнее и лучше, я перейду на неё. Только не надо больше неконструктивной ругани.
Никто не мешает писать на сях и осознавать, какое же это говнище, а не язык.
Альтернативы не нужны, даже в триста раз более удобные и продуманные, нужны удобные средства разработки для нужных платформ под нужные платформы и развитое сообщество, сам язык тут значения не имеет. Но в рамках академического спора о достоинствах языка можно и поговорить о кривизне.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Никто не мешает писать на сях и осознавать, какое же это говнище, а не язык.
Зачем себя мучить? Пиши на нормальных языках. Ну или осознавай, не рассказывая сюда.
TB>Альтернативы не нужны, даже в триста раз более удобные и продуманные, нужны удобные средства разработки для нужных платформ под нужные платформы и развитое сообщество, сам язык тут значения не имеет.
Заведи тему в "Средствах разработки" на тему наличия удобных средств разработки.
TB>Но в рамках академического спора о достоинствах языка можно и поговорить о кривизне.