Re[12]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 14:24
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, _hum_, Вы писали:


BFE>>>на всякий случай, а то ещё скажите, что не видели:

__>>это я совсем не понял, к чему вы привели. что за жах?

BFE>Если на него посмотреть, то можно предположить, почему switch-case такой, какой он есть. — это с одной стороны.


вот, честно, даже в голову не приходит, каким боком там должна проскакивать тема swith (и зачем вообще while(false)? может, while(true) для бесконечного цикла?)
Re[5]: семантика switch/case
От: ononim  
Дата: 16.12.15 14:44
Оценка:
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'ы и вообще сделано оно для облегчения оптимизатору строить оптимизированные таблицы переходов в подходящих дла того местах...

Чтонить банальнохитрое типа:
bool get_fileext(char *dst, size_t len, const char *src)
{    
    for ( len = (src = strrchr(src, '.') ) ? len : 0; (len > 1 && !!(*dst=*src)); --len,++src,++dst);
    *dst = 0;
    return !*src;
}

..с применением вайла будет выглядеть, примерно настолько же понятнее как многоэтажный switch-case переделанный на ифы. Но и настолько же длиннее.
Как много веселых ребят, и все делают велосипед...
Отредактировано 16.12.2015 16:16 ononim . Предыдущая версия . Еще …
Отредактировано 16.12.2015 14:57 ononim . Предыдущая версия .
Отредактировано 16.12.2015 14:54 ononim . Предыдущая версия .
Re[13]: семантика switch/case
От: B0FEE664  
Дата: 16.12.15 14:46
Оценка:
Здравствуйте, _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);               //
И каждый день — без права на ошибку...
Re[3]: семантика switch/case
От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
Дата: 16.12.15 14:48
Оценка:
Здравствуйте, _hum_, Вы писали:

__>ну так, если switch на деле — это завуалированный goto с динамическим выбором метки перехода, то тогда понятно, почему такие извраты на его основе появляются — фактически идет программирование на ассемблере.


Ну, да. Весь С тонкая обёртка над ассемблером.
Ce n'est que pour vous dire ce que je vous dis.
Re[14]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 14:58
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, _hum_, Вы писали:


__>>вот, честно, даже в голову не приходит, каким боком там должна проскакивать тема swith (и зачем вообще while(false)? может, while(true) для бесконечного цикла?)


BFE>А так?

BFE>
BFE>do                          //  switch(data)
BFE>{                           //  {
BFE>    if ( data == 1 )        //      case 1:
BFE>    {                       //  
BFE>        cout << '1';        //        cout << '1';
BFE>        break;              //      break;
BFE>    }                       //  
BFE>    if ( data == 2 )        //      case 2:
BFE>    {                       //  
BFE>        cout << '2';        //        cout << '2';
BFE>        break;              //      break;
BFE>    }                       //  
BFE>    ...                     //  
BFE>    if ( data == 3 )        //      case 3:
BFE>    {                       // 
BFE>        cout << '3';        //        cout << '3';
BFE>        break;              //      break;
BFE>    }                       // 
BFE>}                           //  }
BFE>while(false);               //
BFE>

а можно и так:
bool bDone = false;
 
do {
    if ( data == 1)
    {
        cout << '1';
        bDone = true;
    }
    else
    if ( data == 2)
    {
         cout << '2';
         bDone = true;
    }
    else
    ...
    if ( data == 3)
    {
        cout << '3';
        bDone = true;
    }
}
while(!bDone);


только я все равно ен понял, к чему вы привели соттветствующий код. чтобы показать, что со свитчем он проще?
Re[4]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 15:03
Оценка:
Здравствуйте, Don Reba, Вы писали:

DR>Здравствуйте, _hum_, Вы писали:


__>>ну так, если switch на деле — это завуалированный goto с динамическим выбором метки перехода, то тогда понятно, почему такие извраты на его основе появляются — фактически идет программирование на ассемблере.


DR>Ну, да. Весь С тонкая обёртка над ассемблером.


я в курсе, что си — это "высокоуровневый ассемблер". меня другое смутило, что
1) семантика switch оказалась не такой естественной, как думалось
2) нигде в литературе я не видел, чтобы кто-то обращал на это внимание (соответственно, я только теперь столкнулся с этим)
3) в с++ продолжают протаскивать switсh на равных правах c if, а не как "тяжкое наследие си" (как,например, goto).
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 15:11
Оценка:
Здравствуйте, ononim, Вы писали:


O>фор в отличие от вайла допускает отсутствие любой своей части, вплоть до

O>
for (;;)

что, согласитесь, нельзя отнести к "совсем-совсем другой семантике" (по сравнению с while).

O>что кстати многие, включая меня, считают более адекватным выражением бесконечного цифра нежели while(1)


а по мне, так while(true) более естественно выглядит, чем пустое условие в for (;)



O>>>Я кстати пред сообщение подкрепил примером.

__>>ну, как бы да, для меня это пример из области программирования на "высокоуровневом ассемблере".
O>Просто чтото о чем вы не знали и внезапно узнали. Впрочем двоеточия после case'ов и тот факт что case'ы не приемлют ничего кроме констант как бы намекают на то, что они на метки больше похожи чем на if'ы и вообще сделано оно для облегчения оптимизатору строить оптимизированные таблицы переходов в подходящих дла того местах...

O>Чтонить банальнохитрое типа:

O>
bool get_fileext(char *dst, size_t len, const char *src)
O>{    
O>    for ( len = (src = strrchr(src, '.') ) ? len : 0; (len > 1 && !!(*dst=*src)); --len,++src,++dst);
O>    *dst = 0;
O>    return !*src;
O>}

O>..с применением вайла будет выглядеть, примерно настолько же понятнее как многоэтажный switch-case переделанный на ифы. Но и настолько же длиннее.

это пример кода, который уважаемые люди рекомендуют никогда не писать, если только вы не собираетесь больше никогда его не сопровождать в дальнейшем.
Re[7]: семантика switch/case
От: ononim  
Дата: 16.12.15 16:00
Оценка:
O>>фор в отличие от вайла допускает отсутствие любой своей части, вплоть до
O>>
for (;;)

__>что, согласитесь, нельзя отнести к "совсем-совсем другой семантике" (по сравнению с while).
O>>что кстати многие, включая меня, считают более адекватным выражением бесконечного цифра нежели while(1)
__>а по мне, так while(true) более естественно выглядит, чем пустое условие в for (;)
Ну, если считать что бесконечный цикл — это такой цикл у которого нет условия выхода — то for(;) логичнее, ибо в нем реально нет условия выхода. А while(true) — это цикл с условием выхода, которое просто бесконечно не выполняется.

Кстати отличия switch от if дае глубже чем просто проваливающиеся бряки. Бряков в нем может быть много, даже без проваливания:

switch (var)
{
    case 1:
        if(something1a()) break;
        if(something1b()) break;
        if(something1c()) break;
                something1();
        break;
    case 2:
        if(something2a()) break;
        if(something2b()) break;
        if(something2c()) break;
                something2();
        break;
}


O>>Чтонить банальнохитрое типа:

O>>
bool get_fileext(char *dst, size_t len, const char *src)
O>>{    
O>>    for ( len = (src = strrchr(src, '.') ) ? len : 0; (len > 1 && !!(*dst=*src)); --len,++src,++dst);
O>>    *dst = 0;
O>>    return !*src;
O>>}

O>>..с применением вайла будет выглядеть, примерно настолько же понятнее как многоэтажный switch-case переделанный на ифы. Но и настолько же длиннее.
__>это пример кода, который уважаемые люди рекомендуют никогда не писать, если только вы не собираетесь больше никогда его не сопровождать в дальнейшем.

Ну да, в отличии от многоэтажных кейсов так я почти никогда не пишу, только если очень тороплюсь
Как много веселых ребят, и все делают велосипед...
Отредактировано 16.12.2015 16:05 ononim . Предыдущая версия .
Re[15]: семантика switch/case
От: B0FEE664  
Дата: 16.12.15 16:05
Оценка:
Здравствуйте, _hum_, Вы писали:

__>а можно и так:

Нельзя. При data == 4 цикл никогда не закончится. (в отличии от)
  Скрытый текст
__>
__>bool bDone = false;
 
__>do {
__>    if ( data == 1)
__>    {
__>        cout << '1';
__>        bDone = true;
__>    }
__>    else
__>    if ( data == 2)
__>    {
__>         cout << '2';
__>         bDone = true;
__>    }
__>    else
__>    ...
__>    if ( data == 3)
__>    {
__>        cout << '3';
__>        bDone = true;
__>    }
__>}
__>while(!bDone);
__>


__>только я все равно ен понял, к чему вы привели соттветствующий код.

Это к тому, что обычно смотришь на код и думаешь: "какой дурак его написал?". А всё почему? А потому, что для одного хорошо, для другого — извращение. И наоборот. Как написано в книжке "Рабы Майкрософта" — "красота — в глазах смотрящего".

__>чтобы показать, что со свитчем он проще?

А разве он проще?
И каждый день — без права на ошибку...
Отредактировано 16.12.2015 16:06 B0FEE664 . Предыдущая версия .
Re[2]: семантика switch/case
От: ononim  
Дата: 16.12.15 18:26
Оценка: +1 :)
__>>зачем такая неочевидная и "техническая" семантика?
ARK>Язык Ц криво спроектирован, вот и все.
Язык Ц проектировался с минимально необходимым для обеспечения непротиворечивости конструкций множеством ограничений, а не для облегчения понимания шаблонно мыслящим.

ARK>Там еще есть всякие дебильные штуки, типа эквивалентности a[i] и i[a].

Это в вас говорит отсутствие чувства прекрасного в симметрии.
Как много веселых ребят, и все делают велосипед...
Re: семантика switch/case
От: Erop Россия  
Дата: 16.12.15 20:05
Оценка: :)
Здравствуйте, _hum_, Вы писали:

__>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?

Не знаток, поэтому вместо ответа на вопрос затокам дам совет.
В принципе стоит изучать хотя бы основные конструкции ЯП, перед тем, как пластать код...
В случае С это удобно сделать по этой книжке...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: семантика switch/case
От: AlexRK  
Дата: 16.12.15 20:33
Оценка: -2
Здравствуйте, ononim, Вы писали:

__>>>зачем такая неочевидная и "техническая" семантика?

ARK>>Язык Ц криво спроектирован, вот и все.
O>Язык Ц проектировался с минимально необходимым для обеспечения непротиворечивости конструкций множеством ограничений, а не для облегчения понимания шаблонно мыслящим.

Ерунда. break в свитче не обоснован ничем. Это просто кривость и источник ошибок.

ARK>>Там еще есть всякие дебильные штуки, типа эквивалентности a[i] и i[a].

O>Это в вас говорит отсутствие чувства прекрасного в симметрии.

Вот уж у кого не было чувства прекрасного, так это у создателей Ц.
Re[4]: семантика switch/case
От: ononim  
Дата: 16.12.15 21:25
Оценка: +2 :))
__>>>>зачем такая неочевидная и "техническая" семантика?
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.
Как много веселых ребят, и все делают велосипед...
Re[5]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 23:01
Оценка:
Здравствуйте, ononim, Вы писали:

_
O>Прелесть С в том что он базируется на минимуме концепций. Соответственно он хорош для понимания теми кто, привык оперировать на уровне логических цепочек, строящихся на минимальном базисе, а не на уровне заученных конструкций. Последним это причиняет неудобство потому, что они пытаются вместо постройки ментальной модели того как эти базисы могут взаимодействовать — пытаются заучить наизусть все возможные комбинации базисов, которых оказывается чрезвычайно много, и случается ментальный overflow.

то, о чем вы говорите (минимум базовых конструкций) — это простота языка. а есть еще экспрессивность (выразительность) — возможность в наиболее естественной для человеческой мысли форме изложить в языке задумку.
так вот они друг другу противоречат. самым простым языком является машинный (а если речь про теоретический — то язык лямбда-исчисления), но в то же время он самый невыразительный. языки высокого уровня потому и появились и размножились, что выразительность оказалась важнее (и в каждой области стараются по максимуму ее выжать за счет приемлемой жертвы простотой).
Re[16]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 23:11
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, _hum_, Вы писали:


__>>а можно и так:

BFE>Нельзя. При data == 4 цикл никогда не закончится. (в отличии от)

да в вашем примере то же самое (если считать, что вы описались, и нужно while(true), а не while(false))
но дело же не в этом. я не мог понять, каким боком это относится к обсуждаемой теме


__>>только я все равно ен понял, к чему вы привели соттветствующий код.

BFE>Это к тому, что обычно смотришь на код и думаешь: "какой дурак его написал?". А всё почему? А потому, что для одного хорошо, для другого — извращение. И наоборот. Как написано в книжке "Рабы Майкрософта" — "красота — в глазах смотрящего".

кхм.. а почему тогда сопроводили свой пример текстом "на всякий случай, а то ещё скажите, что не видели: "? обычно такой коммент постят к "каноническим" вещам, которые не знать стыдно...

__>>чтобы показать, что со свитчем он проще?

BFE>А разве он проще?

да, места меньше занимает (нет кучи сравнений и скобок)
Re[2]: семантика switch/case
От: Pavel Dvorkin Россия  
Дата: 17.12.15 04:17
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Там еще есть всякие дебильные штуки, типа эквивалентности a[i] и i[a].


Хуже. Они в С еще и обе эквивалентны *(a+i). Дебилизм, однако
With best regards
Pavel Dvorkin
Re[5]: семантика switch/case
От: AlexRK  
Дата: 17.12.15 05:13
Оценка: +2
Здравствуйте, ononim, Вы писали:

O>switch без break уныл и не нужен.


Ну да, вероятно именно поэтому такой прекрасной конструкции нет ни в одном языке, кроме Ц/Ц++.

O>break в свиче — это просто выход из тела свича, case — просто метки на переходы. Очень удобно, но разумеется не тем кто привык городить многоэтажные if'ы:


Случаи, когда это удобно, можно по пальцам пересчитать, по сравнению со случаями, когда это неудобно. И мало того, что неудобно, так еще и скрытые ошибки провоцирует.

O>Прелесть С в том что он базируется на минимуме концепций. Соответственно он хорош для понимания теми кто, привык оперировать на уровне логических цепочек, строящихся на минимальном базисе, а не на уровне заученных конструкций.


Да нет, это не вполне верно. Ц, конечно, маленький язык, но при этом далеко не везде последовательный. К примеру, можно взглянуть на расположение звездочки при объявлении указателей.
И никакого "минимума концепций" там нет, просто создатели сделали язык, как им казалось правильным. Местами получилось удачно, местами не особо.
Re[7]: ...
От: CEMb  
Дата: 17.12.15 05:21
Оценка: +1 -1
Здравствуйте, T4r4sB, Вы писали:

CEM>>Как мне думается, были рассмотрены всевозможные варианты разбора ветвлений, самый часто используемый был реализован самым простым синтаксисом.


TB>Это так нормальные языки проектируют.

TB>Но к сишке это не относится. Вообще процесс её появления нельзя называть словом "проектировать", к сишке можно отнести только слово "была высрана".

Тарас, вот ты задолбал...
Не нравится — не пиши на сях, никто не в обиде. Зачем в тематический форум вываливать свои субъективные проблемы?
Если знаешь, как надо: поговори с автором или напиши свою альтернативу с++. Если это будет удобнее и лучше, я перейду на неё. Только не надо больше неконструктивной ругани.
Re[8]: ...
От: T4r4sB Россия  
Дата: 17.12.15 08:09
Оценка:
Здравствуйте, CEMb, Вы писали:

CEM>Тарас, вот ты задолбал...

CEM>Не нравится — не пиши на сях, никто не в обиде. Зачем в тематический форум вываливать свои субъективные проблемы?
CEM>Если знаешь, как надо: поговори с автором или напиши свою альтернативу с++. Если это будет удобнее и лучше, я перейду на неё. Только не надо больше неконструктивной ругани.

Никто не мешает писать на сях и осознавать, какое же это говнище, а не язык.
Альтернативы не нужны, даже в триста раз более удобные и продуманные, нужны удобные средства разработки для нужных платформ под нужные платформы и развитое сообщество, сам язык тут значения не имеет. Но в рамках академического спора о достоинствах языка можно и поговорить о кривизне.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: ...
От: CEMb  
Дата: 17.12.15 08:20
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Никто не мешает писать на сях и осознавать, какое же это говнище, а не язык.


Зачем себя мучить? Пиши на нормальных языках. Ну или осознавай, не рассказывая сюда.

TB>Альтернативы не нужны, даже в триста раз более удобные и продуманные, нужны удобные средства разработки для нужных платформ под нужные платформы и развитое сообщество, сам язык тут значения не имеет.


Заведи тему в "Средствах разработки" на тему наличия удобных средств разработки.

TB>Но в рамках академического спора о достоинствах языка можно и поговорить о кривизне.


Заведи тему в "КСВ", там тебя поддержат.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.