семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 10:33
Оценка: +1 :))) :))) :))) :))) :))) :))) :))) :))) :))
Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:
switch(1) 
{
    case 1 : cout << '1'; // prints "1",
    case 2 : cout << '2'; // then prints "2"
}

switch(1) 
{
    case 1 : cout << '1'; break; // prints "1" and exits the switch
    case 2 : cout << '2'; break;        
}


p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?
Re: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 11:39
Оценка: +5 -4
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:


О сколько нам открытий чудных чудо открытий принесёт.

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


Потому что не тем местом думали, когда язык делали. А потом этот бред во все прочие сишкообразные языки потащили. Потому что люди — тупые.
Только не надо про вот это "раз в год таки нужно протекание сквозь ветку", на это "раз в год" могли бы придумать вставку слова continue например.

Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например
case 1,3,5..8 :
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 16.12.2015 11:42 T4r4sB . Предыдущая версия .
Re[6]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 12:07
Оценка: -7
Здравствуйте, CEMb, Вы писали:

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


Это так нормальные языки проектируют.
Но к сишке это не относится. Вообще процесс её появления нельзя называть словом "проектировать", к сишке можно отнести только слово "была высрана".
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 12:29
Оценка: +5
Здравствуйте, Mr.Delphist, Вы писали:

MD>Запятая уже занята для других целей


Спасибо томпсону и ритчи за это!

MD>Да и вообще, читайте маны — они рулез.


Если в мане будет написано "ехать на лошади стоя очень просто — надо лишь не падать вперёд, назад, вправо и влево", то это не значит, что заставлять людей ездить на лошадях стоя — это нормально.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:41
Оценка: -3 :))
Здравствуйте, savitar, Вы писали:

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


S>возможно вынос в отдельную ф-цию поможет, типа такого:

S>
S>int get_x_from_a(int a)
S>{
S>    switch (a)
S>    {
S>    case 1: return 1001;
S>    case 2: return 4002;
S>    // и т.д.
S>    };
S>}
S>


безусловно, но использовать более одного return — это моветон
Re: семантика switch/case
От: ononim  
Дата: 16.12.15 13:17
Оценка: 1 (1) +2 -1
__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/...
А зачем switch-у семантика как у if-ов если она уже есть у if-ов?
Я кстати хотя Duff's device'ом в реальной жизни не пользовался но такие строчки:

switch (var)
{
case VALUE1: DoSomethingFor1();
case VALUE2: DoSomethingFor1And2();
    break;

case VALUE3: DoSomethingFor3();
default: DoSomethingFor3AndEverythingElse();
}


Пишу частенько.
Как много веселых ребят, и все делают велосипед...
Отредактировано 16.12.2015 13:21 ononim . Предыдущая версия .
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: семантика switch/case
От: nen777w  
Дата: 17.12.15 09:38
Оценка: +2 :))
__>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?

Это Вы еще для себя семантику try, catсh для исключений в иерархии не открыли
Re[7]: о0
От: Sheridan Россия  
Дата: 17.12.15 13:43
Оценка: -2 :))
Здравствуйте, AlexRK, Вы писали:

S>>>>Аргументы?

ARK>>>Точно такие же скачки сквозь разные ветки управления. Сишный оператор switch не является оператором структурного программирования.
S>>Нет. При отсутствии break он будет выполняться строго сверху вниз, начиная от сработавшего case.
ARK>Строго вниз, строго вверх, нестрого назад — не имеет значения. Это разные ветки управления.
С этого места поподробнее: с какого времени порядок следования инструкций перестал иметь значение?

ARK>>>Чтобы "код выполнялся не полностью", существуют функции.

S>>Ну да, вместо читаемого кода плодить кучу функций и оборачивать всё if'ами. Годный подход, ага.
ARK>Какую кучу функций? Функций должно быть столько, сколько надо.
ARK>Вместо вашего монстра код должен быть таким:
ARK>
ARK>void DoFullWork()
ARK>{
ARK>    checkLastWork();
ARK>    clearTemp();
ARK>    DoOptimizedWork();
ARK>}

ARK>void DoOptimizedWork()
ARK>{
ARK>    ClearCaches();
ARK>    DoWork();
ARK>}

ARK>void DoWork()
ARK>{
ARK>    ...
ARK>}
ARK>

А чего это забываем, что эти функции вызывать, обернув if'ами? Давай я за тебя
void DoFullWork()
{
    checkLastWork();
    clearTemp();
    DoOptimizedWork();
}

void DoOptimizedWork()
{
    ClearCaches();
    DoWork();
}

void DoWork()
{
    ...
}

int main()
{
    someFlagEnum flag = getFlag();
    if(flag==doFullWork)      { DoFullWork(); }
        if(flag==doOptimizedWork) { DoOptimizedWork(); }
        if(flag==justDoIt)        { DoWork(); }
}

Неужели ты будешь жертвовать читабельностью кода, будешь запутывать код только ради того чтобы свитч не применять? Да ладно?
Неужели вариант со свичем НАСТОЛЬКО хуже?
switch(getFlag())
{
    case doFullWork:      { checkLastWork(); clearTemp(); }
    case doOptimizedWork: { clearCaches(); }
    case justDoIt:        { doWork(); }
}

Более того, добавляем еще три флага и рисуем еще три функции? Еще больше запутываем?
Ты случаем не споришь только ради спора?



S>>switch в данном случае не при чём. Надо быть просто внимательным.

ARK>Абсолютно все языковые конструкции — это об удобстве и внимательности. Некоторые удобны, некоторые нет. А некоторые просто уродливы, как сишный switch.
он такой везде.

ARK>UPD. Сейчас посмотрел, в Java и JavaScript break необязателен, хотя мне казалось, что был обязателен. Теперь я знаю 4 языка с таким оператором.

Проверил? Да ладно? о0
Я вот действительно проверил: http://www.sergos.ru/player/js.html
    function sw(val)
    {
      $( "#dd" ).append( "without break. val: " + val + "<br />---<br />" );
      switch(val)
      {
        case 1: { $( "#dd" ).append( "case 1<br />" ); }
        case 2: { $( "#dd" ).append( "case 2<br />" ); }
        case 3: { $( "#dd" ).append( "case 3<br />" ); }
      }
      $( "#dd" ).append( "-----------------------------<br />" );
    }
    
    function swb(val)
    {
      $( "#dd" ).append( "with break. val: " + val + "<br />---<br />" );
      switch(val)
      {
        case 1: { $( "#dd" ).append( "case 1<br />" ); break; }
        case 2: { $( "#dd" ).append( "case 2<br />" ); break; }
        case 3: { $( "#dd" ).append( "case 3<br />" ); break; }
      }
      $( "#dd" ).append( "-----------------------------<br />" );
    }
    
    for (i=1; i<=3; i++)
    {
    sw(i);
    swb(i);
    }


ARK>>>Да нет, такого нет больше нигде (ну, лично я не помню других подобных языков).

S>>Примеры?
ARK>C#, Go, Ruby, Pascal, Ada, Eiffel...
Точно так же проверял, как и жабаскрипт?
Matrix has you...
Re[13]: семантика switch/case
От: neFormal Россия  
Дата: 18.12.15 07:40
Оценка: +2 :))
Здравствуйте, T4r4sB, Вы писали:

F>>ага, лёгкий способ завалить человека на собеседовании.

TB>Зачем? Если очень хочется не принимать человека, то можно и так сказать.
TB>А если собеседующий всерьёз считает, что знание подобных конструкций нужно программисту, то он идиот.

человек заявляет, что знает c++ наотлично, но не знает таких простых вещей?
...coding for chaos...
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:46
Оценка: 12 (1) +2
Здравствуйте, c-smile, Вы писали:

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


__>>Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:


CS>На вот еще для просветления:

CS>http://www.codeproject.com/Tips/29524/Generators-in-C



да, спасибо. это начинает прояснять ситуацию с тем, где же, действительно, может быть полезна эта фича.

подводя итог:

1) switch/case — не аналог if, а аналог динамического goto. тот факт, что многие его таким не воспринимают (в том числе и я до недавнего времени), думаю, является результатом того, что в большинстве случаев он используется с break, то есть, в качестве выбора из альтернатив + в учебниках и доках всегда идет в той же теме, что и if, наводя на мысли, что это "из одной оперы", как for и while, а потому бдительность падает + выбор ключевых слов неудачен — не наводит на мысль о goto-переходах и метках (gotocase вместо switch, например, сразу бы наводило ан нужные мысли);

2) это штука в с++ дает возможность реализовать механизм перехода по динамически определяемой метке, чего другими средствами добиться невозможно (только если использовать ассемблерные вставки). в качестве реально полезного применения можно привести возможность реализации на си сопрограмм и парадигмы реактивного программирования (см., например, Reactive C: An Extension of C To Program Reactive Systems)
Re[3]: семантика switch/case
От: watchmaker  
Дата: 16.12.15 12:40
Оценка: 1 (1) +2
Здравствуйте, Mr.Delphist, Вы писали:

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


TB>>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например

TB>>
TB>>case 1,3,5..8 :
TB>>


MD>Запятая уже занята для других целей :)

MD>Да и вообще, читайте маны — они рулез.

Вот как раз в манах (например, в ISO/IEC 9899:1999 в главе Language syntax summary) явно сказано, что в выражении сase 1,3,5: statement запятая не может носить смысл оператора (а чтобы носила, нужно обязательно обернуть выражение в скобки так: сase (1,3,5): statement).
Так что в теории задействовать запятую под перечисление вариантов в данном контексте можно — семантика старого кода не поменяется и ничего не сломается.
Re[11]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:55
Оценка: +3
Здравствуйте, _hum_, Вы писали:

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


Вы скорее всего выразили отсутствие знаний в этом вопросе. То что Вы не знаете не является не очевидным.

Для меня человеческая семантика:
swicth(a) {
    case 1: x = 1001; break;
    case 2: x = 4002; break;
};
С уважением!
Re[5]: семантика switch/case
От: VladFein США  
Дата: 17.12.15 17:29
Оценка: +2 :)
Здравствуйте, _hum_, Вы писали:

__>... и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан


Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch
Отредактировано 17.12.2015 17:29 VladFein . Предыдущая версия .
Re[5]: семантика switch/case
От: ononim  
Дата: 17.12.15 19:19
Оценка: +1 :))
TB>>Если в мане будет написано "ехать на лошади стоя очень просто — надо лишь не падать вперёд, назад, вправо и влево",
MD>Под микроконтроллеры примерно так и пишут: памяти N мегабайт, эксепшны недоступны, длительность прерывания не более X тактов. И ничего, живут же люди.
Последний раз когда писал под МК (на C, да) N было равно 0.008
Как много веселых ребят, и все делают велосипед...
Re[12]: о0
От: AlexRK  
Дата: 17.12.15 19:01
Оценка: 10 (2)
Здравствуйте, Sheridan, Вы писали:

ARK>>По сути: C#, Go, Ruby, Pascal, Ada, Eiffel — обладают семантикой, отличной от C/C++.

S>Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.

Наговнокодил, как и обещал.

C#: https://ideone.com/BMkFax
break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.

Go: https://ideone.com/CvtZwE
break нет, хотя есть его противоположность — fallthrough. Что с точки зрения выбора по умолчанию, на мой взгляд, гораздо лучше.

Ruby: https://ideone.com/o6U0ra
Pascal: https://ideone.com/JWO3wT
Ada: https://ideone.com/3NwBYB
В этих языках ни break, ни аналогов, ни антиподов нет. Все в точном соответствии с примитивом "ветвление" в структурном программировании. Так что эти примеры демонстрируют только синтаксис.
Re: семантика switch/case
От: c-smile Канада http://terrainformatica.com
Дата: 18.12.15 00:50
Оценка: 3 (1) +1
Здравствуйте, _hum_, Вы писали:

__>Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:


На вот еще для просветления:
http://www.codeproject.com/Tips/29524/Generators-in-C
Re: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 10:50
Оценка: +1 :)
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; // prints "1",
__>    case 2 : cout << '2'; // then prints "2"
__>}
__>

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; break; // prints "1" and exits the switch
__>    case 2 : cout << '2'; break;        
__>}
__>


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


Что тут не очевидного ?
switch(1) {
    case 1:
    case 2:
    case 3:
    case 4:
        std::cout << '1';
    default: break;
}
// prints 1
С уважением!
Re[2]: семантика switch/case
От: Mr.Delphist  
Дата: 16.12.15 12:20
Оценка: :))
Здравствуйте, T4r4sB, Вы писали:

TB>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например

TB>
TB>case 1,3,5..8 :
TB>


Запятая уже занята для других целей

Да и вообще, читайте маны — они рулез.
Re[10]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:50
Оценка: :))
Здравствуйте, xobotik, Вы писали:

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


__>> я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.


X>Вы хотите, чтобы код с break и без него выполнялся одинаково? И зачем? А как тогда реализовать спуск вниз через case'ы?


я хочу решить задачу — наиболее выразительно реализовать
"если значение a совпадает с 1, то присвоить res значение 1001, если совпадает с 2, то присвоить res значение 4002, и т.д."
с точки зрения человеческой семантики это должно выглядеть в точности как
swith(a)
{
case 1: res = 1001;
case 2: res = 4002;
};

но в си оказалось, что эта конструкция закреплена за совсем другой семантикой. вот и высказываю свое удивление и недовольство

спуск вниз через все кейсы — это нечто ассмеблеро-подобное. используйте тогда уже сразу goto.
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 13:05
Оценка: +2
Здравствуйте, B0FEE664, Вы писали:

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


__>> если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается ...


BFE>что ось абсцисс направлена влево.

BFE>И это вы называете естественным?

юмор оценил

а если уж дотошничать, то это алгебраическая запись, а не геометрическая — спросите у школьников, как записывается условие, число больше нуля, они вам скажут, что именно так, а не (0 < a) "нуль меньше числа"
Re: семантика switch/case
От: AlexRK  
Дата: 16.12.15 13:41
Оценка: +1 -1
Здравствуйте, _hum_, Вы писали:

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


Язык Ц криво спроектирован, вот и все.

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

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

Это в вас говорит отсутствие чувства прекрасного в симметрии.
Как много веселых ребят, и все делают велосипед...
Re[3]: семантика switch/case
От: AlexRK  
Дата: 16.12.15 20:33
Оценка: -2
Здравствуйте, ononim, Вы писали:

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

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

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

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

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

Вот уж у кого не было чувства прекрасного, так это у создателей Ц.
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[5]: семантика switch/case
От: B0FEE664  
Дата: 17.12.15 09:59
Оценка: +2
Здравствуйте, _hum_, Вы писали:

__>2) нигде в литературе я не видел, чтобы кто-то обращал на это внимание (соответственно, я только теперь столкнулся с этим)

Значит вы не читали Страуструпа.
И каждый день — без права на ошибку...
Re[2]: семантика switch/case
От: AlexRK  
Дата: 17.12.15 10:46
Оценка: :))
Здравствуйте, Sheridan, Вы писали:

S>Есть if и есть switch и они обязаны себя вести по разному


Они и ведут себя по разному. Ифы — набор произвольных условий, свитчи — выбор подходящего значения для одного выражения.
А вот в чью светлую голову пришло решение скрестить оператор выбора с оператором безусловного перехода...

S>switch полезен тем, что можно писать так, что код сможет выполняться не полностью. Например каттотак

S>
S>switch(flag)
S>{
S>    case doFullWork:      { checkLastWork(); clearTemp(); }
S>    case doOptimizedWork: { clearCaches(); }
S>    case justDoIt:        { doWork(); }
S>}
S>


Жуть. Goto в худшем виде.

Вообще, конструкция switch в том виде, в каком она есть в С/C++, фундаментально ущербна. На мой взгляд, это один из крупных фейлов в языкостроении. Хуже, наверное, только нуллабельные указатели.
Re[3]: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 10:52
Оценка: -1 :)
Здравствуйте, AlexRK, Вы писали:

S>>switch полезен тем, что можно писать так, что код сможет выполняться не полностью. Например каттотак

S>>
S>>switch(flag)
S>>{
S>>    case doFullWork:      { checkLastWork(); clearTemp(); }
S>>    case doOptimizedWork: { clearCaches(); }
S>>    case justDoIt:        { doWork(); }
S>>}
S>>


ARK> Жуть. Goto в худшем виде.

Аргументы?
Как по мне, так тут всё чётко понятно как код исполняться будет. goto в этом отношении даёт возможность выстрелить себе в ногу, а switch нет

ARK>Вообще, конструкция switch в том виде, в каком она есть в С/C++,

Он такой везде
Matrix has you...
Re[7]: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 13:15
Оценка: -2
Здравствуйте, T4r4sB, Вы писали:

S>>switch в данном случае не при чём. Надо быть просто внимательным.

TB>Убивает такой подход.
TB>Езда на лошади стоя тут ни при чём. Надо лишь не падать вперёд, назад, влево и вправо.
Убивает как раз подход "я не хочу ничего думать, я не хочу учиться, я не хочу быть внимательным, дайте мне такую штуку, чтобы вместо меня работала".
Matrix has you...
Re[10]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 15:51
Оценка: +1 :)
Здравствуйте, B0FEE664, Вы писали:

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


__>>... то вам и в голову не может прийти, что за простым switch/case могут скрываться какие-то системные вещи типа goto-переходов по меткам.


BFE>Слушайте и не говорите, что вас никто не предупреждал: в С++ почти все вещи не то, чем они кажутся.


BFE>Например, то равенство, которое упоминается ниже: a[b]==b[a] может как быть истинным, так и нет.

BFE>Или, например, вот такая конструкция:
BFE>A(b, с) = f();
BFE>может являться присваиванием переменным b и c результата f()

BFE>И вообще, есть множество вещей, которые просто невозможны в других языках. Например, можно передать в функцию параметром объект до того, как он был создан.


нет, не та аналогия. скорее так — написано 2 + 5 , а на самом деле производится умножение 2 на 5 (то есть, форма записи не столько приводит в замешательство — "как это понимать?!" (и отправляет к чтению док.), сколько вызывает эффект "очевидно же, что здесь будет выполняться сложение", и последующие мытарства по поиску ошибок).
я же говорю, что сам только теперь начал рыться в подробностях семантики свитча, потому как много-много лет для меня было "очевидно" по названию, структуре и примерам использования, какая у него семантика.
Re[6]: семантика switch/case
От: утпутуук  
Дата: 23.12.15 10:16
Оценка: :))
Здравствуйте, B0FEE664, Вы писали:

__>>2) нигде в литературе я не видел, чтобы кто-то обращал на это внимание (соответственно, я только теперь столкнулся с этим)

BFE>Значит вы не читали Страуструпа.

Поправил

Ну точно, как я в первом семестре. Пропустил лекцию, там где рассказывали про обращение к полям структуры по указателю, и весь семестр
// вместо
p->member = N;
// писал
T tmp = *p;
tmp.member = N;
*p = tmp;


Отредактировано 23.12.2015 10:19 утпутуук . Предыдущая версия .
Re[2]: семантика switch/case
От: AlexRK  
Дата: 30.12.15 07:58
Оценка: +2
Здравствуйте, maxluzin, Вы писали:

M>В известной книжке отцов-основателей языка "С" Кернигана и Ритчи в главе 3.4 приводится такой пример:


Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):

#include <stdio.h>
main() /* подсчет цифр, символов-разделителей и прочих символов */
{
    int c, i, nwhite, nother, ndigit[10];
    nwhite = nother = 0;
    for (i = 0; i < 10; i++)
        ndigit[i] = 0;
    while ((с = getchar()) != EOF) {
        switch (c) {
        case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
            ndigit[c - '0']++;
        case ' ', '\n', '\t':
            nwhite++;
        default:
            nother++;
        }
    }
    printf ("цифр =");
    for (i = 0; i < 10; i++)
        printf (" %d", ndigit[i]);
    printf(", символов-разделителей = %d, прочих = %d\n",
            nwhite, nother);
    return 0;
}


Проще, короче, нагляднее, безопаснее.
Если обработчики веток совпадают лишь частично, внутри таких веток можно уже разрулить if-ами.
Паттерн-матчинг, конечно, круче, но про него в контексте Ц говорить, наверное, не очень уместно.
Re[11]: семантика switch/case
От: enji  
Дата: 10.01.16 18:42
Оценка: 12 (1)
Здравствуйте, Sheridan, Вы писали:

S>Ну дай пожалуйста линк на алиэкспресс какой нибудь на базовый набор.


Ну вот тебе ардуино уно

А вот тоже самое, но еще с кнопочками, макеткой, светиками и прочим.

Ну и просто в поиске там вбей arduino и поставь бесплатную доставку — тонны всякого разного
Re[4]: семантика switch/case
От: DarkEld3r  
Дата: 17.12.15 16:46
Оценка: 8 (1)
Здравствуйте, Sheridan, Вы писали:

ARK>>Вообще, конструкция switch в том виде, в каком она есть в С/C++,

S>Он такой везде
Нет.

В D каждый case должен оканчиваться или break или "goto case" (явное указание провалиться дальше). То есть случайно пропустить break не получится. Ну и там есть некоторое количество специальных случаев когда break не требуется, например, если выбрасывается исключение.
В Swift и Go есть специальное ключевое слово fallthrough, а break используется по умолчанию и явно писать его не требуется.
В C#, опять же, неявного fallthrough нет, зато есть goto на любой case.
Некоторые языки (например, Rust) обходятся без switch как такового и вместе этого предлагают паттерн матчинг. Естественно, без fallthrough.
Отредактировано 17.12.2015 17:41 DarkEld3r . Предыдущая версия .
Re[9]: семантика switch/case
От: enji  
Дата: 10.01.16 14:12
Оценка: 6 (1)
Здравствуйте, Sheridan, Вы писали:

S>А обвязка? Ну, БП, интерфейсы. К компу надо ж подключить....


там встроенный адаптер usb-usart, оттуда же оно и питается. Можно подключить к компу usb-шнурком и заливать проги / общаться по com-порту

Можно отдельный БП сделать из какой-нить телефонной зарядки. Плат расширений много на любой вкус — реле, ethernet, радио, движки.
Re[14]: о0
От: AlexRK  
Дата: 18.12.15 06:49
Оценка: 5 (1)
Здравствуйте, DarkEld3r, Вы писали:

DE>Вот так не ругается:

DE>https://ideone.com/zVqfmz
DE>Странно, в общем. Хотя я С# не знаю.

Похоже на ошибку в компиляторе Mono. C# не допускает проваливаний через ветки, и на дотнете этот код не компилируется.
Re: семантика switch/case
От: SaZ  
Дата: 16.12.15 10:54
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>...


Ещё можно вот так.
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:13
Оценка: -1
Здравствуйте, xobotik, Вы писали:

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



X>Что тут не очевидного ?

X>
X>switch(1) {
X>    case 1:
X>    case 2:
X>    case 3:
X>    case 4:
X>        std::cout << '1';
X>    default: break;
X>}
X>// prints 1
X>


неочевидно то, что case срабатывает не постоянно, а только один раз. то есть, это не условие входа в ветку, идущую после case (как можно было бы подумать), а некий аналог метки для перехода по goto из switch:
goto (label_1) {
    lalel_1:
    label_2:
    label_3:
    label_4:
        std::cout << '1';
    break;
}
// prints 1
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:15
Оценка: +1
Здравствуйте, SaZ, Вы писали:

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


__>>...


SaZ>Ещё можно вот так.


ну так, если switch на деле — это завуалированный goto с динамическим выбором метки перехода, то тогда понятно, почему такие извраты на его основе появляются — фактически идет программирование на ассемблере.
Re[2]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 11:40
Оценка: +1
Здравствуйте, BulatZiganshin, Вы писали:

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


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


BZ>case 1: case 2: ....


Для этого нафиг не нужна такая ублюдочная семантика. Если бы в кейсах можно было ставить диапазоны и перечисления, то это бы покрыло этот случай.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 11:44
Оценка: :)
Здравствуйте, _hum_, Вы писали:

__>неочевидно то, что case срабатывает не постоянно, а только один раз. то есть, это не условие входа в ветку, идущую после case (как можно было бы подумать), а некий аналог метки для перехода по goto из switch:

__>
__>goto (label_1) {
__>    lalel_1:
__>    label_2:
__>    label_3:
__>    label_4:
__>        std::cout << '1';
__>    break;
__>}
__>// prints 1
__>


Тут немного иначе нужно думать, немного другими абстракциями.
Есть набор состояний, допустим S = { State1, State2, ... , StateN }
Есть регистр (R), который содержит текущее состояние.
На группу состояний S' — подгруппа S, или на одно любое состояние из S
есть набор инструкций или одна инструкция.
После завершения работы инструкций, выходим из обработки состояний или продолжаем работу.
В принципе если представить такими абстракциями, то более понятно все будет.
С уважением!
Re[9]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:38
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__> я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.


Вы хотите, чтобы код с break и без него выполнялся одинаково? И зачем? А как тогда реализовать спуск вниз через case'ы?
С уважением!
Re[9]: оффтоп
От: xobotik Россия  
Дата: 16.12.15 12:44
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>безусловно, но использовать более одного return — это моветон


И когда это стало моветоном ? Можно пруфы?
С уважением!
Re[13]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 13:09
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

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


X>>Для меня человеческая семантика:


TB>Крестодеформация

Re[12]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:12
Оценка: +1
Здравствуйте, xobotik, Вы писали:

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


X>>> А как тогда реализовать спуск вниз через case'ы?


TB>>Действительно, раз томсон и ричи реализовали этот спуск именно так, то это значит, что никаких иных способов в приниципе существовать не может и никто до иных способов никогда не смог бы додуматься


X>А кто говорит, что в принципе иных способов не может и никто до иных способов никогда не смог бы додуматься?


Ну тогда я не понимаю смысла задавать такие вопросы, "а как иначе реализовать". Неужели сходу не придумать 100500 вариантов? Да как угодно, явным словом continue, явным словом goto metka, или ещё каким явным словом, очевидно же, что такой случай более редкий, и значит именно в этом более редком случае и надо заставлять писать какое-нибудь слово.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[13]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 13:16
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>речь шла о человечности семантики для случая без break


Не в той ветке форума написали, в Философию программирования надо было

Вы как-то не правильно немного рассуждаете, берете свое субъективное мнение, проецируете на всех людей и убеждаете меня
в том, что ваша человеческая семантика, более человечная или исключительно человечная. Которая причем существует исключительно
в вашем воображении и реальных компиляторов поддерживающих "Вашу человеческую семантику" нет.
С уважением!
Отредактировано 16.12.2015 13:27 xobotik . Предыдущая версия .
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 13:19
Оценка: +1
Здравствуйте, ononim, Вы писали:

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


__>>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/...

O>А зачем switch-у семантика как у if-ов если она уже есть у if-ов?

затем же, зачем есть три конструкции для организации цикла — для более экспрессивного задания алгоритма.
Re[3]: семантика switch/case
От: ononim  
Дата: 16.12.15 13:23
Оценка: +1
O>>Здравствуйте, _hum_, Вы писали:
__>>>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/...
O>>А зачем switch-у семантика как у if-ов если она уже есть у if-ов?
__>затем же, зачем есть три конструкции для организации цикла — для более экспрессивного задания алгоритма.
ну, скажем for имеет совсем-совсем не такую семантику как while. И в каком-то особенно философском смысле for отличается от while как switch от if/else. Я кстати пред сообщение подкрепил примером.
Как много веселых ребят, и все делают велосипед...
Отредактировано 16.12.2015 13:24 ononim . Предыдущая версия .
Re[4]: семантика switch/case
От: Mr.Delphist  
Дата: 16.12.15 14:00
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

TB>Если в мане будет написано "ехать на лошади стоя очень просто — надо лишь не падать вперёд, назад, вправо и влево",

Под микроконтроллеры примерно так и пишут: памяти N мегабайт, эксепшны недоступны, длительность прерывания не более X тактов. И ничего, живут же люди.

TB>то это не значит, что заставлять людей ездить на лошадях стоя — это нормально.

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

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

Не знаток, поэтому вместо ответа на вопрос затокам дам совет.
В принципе стоит изучать хотя бы основные конструкции ЯП, перед тем, как пластать код...
В случае С это удобно сделать по этой книжке...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 11:13
Оценка: +1
Здравствуйте, AlexRK, Вы писали:

S>>Аргументы?

ARK>Точно такие же скачки сквозь разные ветки управления. Сишный оператор switch не является оператором структурного программирования.
Нет. При отсутствии break он будет выполняться строго сверху вниз, начиная от сработавшего case.

ARK>Чтобы "код выполнялся не полностью", существуют функции.

Ну да, вместо читаемого кода плодить кучу функций и оборачивать всё if'ами. Годный подход, ага.

S>>Как по мне, так тут всё чётко понятно как код исполняться будет. goto в этом отношении даёт возможность выстрелить себе в ногу, а switch нет

ARK>Не дает? Ну-ну. В действительности здесь прямо-таки раздолье для стрельбы по ногам. Позже постараюсь нарыть ссылку про ошибку в маршрутизаторе, написанном на С, из-за пропущенного break в свитче, приведшую к параличу линии связи. Сейчас не могу вспомнить, где читал.
if(val=15) {}


switch в данном случае не при чём. Надо быть просто внимательным.

ARK>>>Вообще, конструкция switch в том виде, в каком она есть в С/C++,

S>>Он такой везде
ARK>Да нет, такого нет больше нигде (ну, лично я не помню других подобных языков).
Примеры?
Matrix has you...
Re[8]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 13:18
Оценка: +1
Здравствуйте, Sheridan, Вы писали:

S>Убивает как раз подход "я не хочу ничего думать, я не хочу учиться, я не хочу быть внимательным, дайте мне такую штуку, чтобы вместо меня работала".


Понятно, что без труда не выловишь и рыбку из пруда. Но в то же время, не стоит оправдывать совершенно идиотские недоработки, которые усложняют людям жизнь, не давая взамен никаких реальных преимуществ. Вот создали людям на пустом месте граблеопасное место, в котором надо быть внимательным. У человека ресурс внимания ограничен вообще-то, быть внимательным всё время — невозможно.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: семантика switch/case
От: neFormal Россия  
Дата: 17.12.15 13:53
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

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


а как же?
https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%94%D0%B0%D1%84%D1%84%D0%B0
...coding for chaos...
Re[11]: семантика switch/case
От: ononim  
Дата: 17.12.15 14:45
Оценка: +1
S>>Это НЕ недоработки, друг мой. Такое поведение заложено в свитч изначально. И оно, наравне с if, позволяет гибко управлять обработкой условий.
TB>Разве не очевидно, что можно придумать куда менее травмоопасные способы добиться той же или даже большей гибкости?
TB>Зачем такие грабли жирные повесили? Ради чего? Только по скудоумию двух кульных какир из 70го года.
Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю"
Как много веселых ребят, и все делают велосипед...
Re[12]: мда...
От: ononim  
Дата: 17.12.15 15:15
Оценка: +1
S>>>Это НЕ недоработки, друг мой. Такое поведение заложено в свитч изначально. И оно, наравне с if, позволяет гибко управлять обработкой условий.
TB>>Разве не очевидно, что можно придумать куда менее травмоопасные способы добиться той же или даже большей гибкости?
TB>>Зачем такие грабли жирные повесили? Ради чего? Только по скудоумию двух кульных какир из 70го года.
S>Я не могу понять что в switch не так, чем он травмоопасен?

Это холивар "либерализм рулит" vs "а вот при Сталине case-ы не проваливались бы"
Как много веселых ребят, и все делают велосипед...
Re[7]: семантика switch/case
От: ononim  
Дата: 17.12.15 21:26
Оценка: +1
DE>>>В Swift и Go есть специальное ключевое слово fallthrough, а break используется по умолчанию и явно писать его не требуется.
S>>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.
TB>Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть. Мелочь какая. И совершенно ненужная, реальные пацаны же не падают. Зря они так сделали короче.
А потом набегут питонисты, и начнут говорить что проваливающийся в пределах отступа if — плохо, что они по привычке написали
if (can())
  do();
  do_hast();
  do_hast_mich();

И du_hast() сработал совершенно внезапно для всех бывших петонистов, а значит надо срочно-обязательно ввести фигурные скобочки после if. Чтоб было четко видно. ну и чтоб не было вот такого
if (can());
  do();

на что кстати лично я напарывался чисто механически, во всяком случае мне это запомнилось, в отличии от проваливающихся кейсов.
Как много веселых ребят, и все делают велосипед...
Отредактировано 17.12.2015 23:35 ononim . Предыдущая версия .
Re[13]: мда...
От: Sheridan Россия  
Дата: 17.12.15 22:09
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

S>>Ради этого надо вонь поднимать и switch ругать?

TB>Писать бряк после каждой ветки — это неинтуитивно и противоестественно.
Кто на что учился. Для меня противоестественно НЕ писать бряк в case

S>>А когда "студент" споткнется об

S>>
S>>if(val=16) {...}
S>>

S>>, тогда нужно еще и обработку условий коричнево помазать, так что ли?
TB>Компилятор обычно предупреждает об этом. Зря, наверное, это предупреждение ввели, ведь на этом только недоучки спотыкаются.
Ну так -Wimplicit-fallthrough для clang в транке
gcc же еще держится. С 2002 года fr висит https://gcc.gnu.org/bugzilla/show_bug.cgi?id=7652 Видимо, НАСТОЛЬКО нужен


TB>А реальным пацанам ничего не стоит всегда каждый секунду быть на 360 градусов внимательными.

Ну как бы всё почти так
Matrix has you...
Re[16]: о0
От: AlexRK  
Дата: 18.12.15 06:56
Оценка: :)
Здравствуйте, Sheridan, Вы писали:

S>Мне всё равно непонятно, чем ц++ свич не угодил


В структурном программировании есть набор базовых примитивов, из которых строится все остальное. Это последовательность, цикл и ветвление. Ц++ свитч не вписывается в этот набор — это ветвление со встроенным goto. Чем плох или хорош goto — сломано много копий. В целом он признан скорее вредным, чем полезным (хотя некоторые люди считают, что иногда он к месту). Ситуацию с сишным свитчем еще усугубляет то, что goto в нем является неявным. Лучше ли явное, чем неявное? Все тоже считают по-разному.
Re[17]: о0
От: Sheridan Россия  
Дата: 18.12.15 07:04
Оценка: :)
Здравствуйте, AlexRK, Вы писали:

S>>Мне всё равно непонятно, чем ц++ свич не угодил

ARK> Лучше ли явное, чем неявное? Все тоже считают по-разному.
Ну break же явно прописываются. Что не так?
Matrix has you...
Re[5]: JFYI: computed goto
От: watchmaker  
Дата: 18.12.15 13:41
Оценка: +1
Здравствуйте, _hum_, Вы писали:

__>и gcc тоже?

Что значит «gcc тоже»? Выше ссылка и так ведёт на документацию gcc с описанием этой фичи. Конечно, в gcc это работает. Вроде, даже они первые и реализовали эту возможность для C/C++, а уж потом такой синтаксис расползся по остальным компиляторам.

__>а как же новый стандарт с его && для move-семантики?

Какой новый стандарт? При чём тут move-семантика? Когда в коде встречаешь конструкцию
if (a && b) { ... }
тоже возникает мысль об move-семантике? Или всё же о том, что && означает в данном контексте логическое-И? Аналогично и && в контексте меток имеет смысл унарного оператора взятия адреса.
А вообще, эта возможность присутствует во многих языках, это не изобретение gcc: и в древнем фортране, и в бейсике, и в PL/I аналоги есть.
Re[3]: семантика switch/case
От: maxluzin Европа  
Дата: 30.12.15 10:01
Оценка: +1
Здравствуйте, AlexRK, Вы писали:

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


M>>В известной книжке отцов-основателей языка "С" Кернигана и Ритчи в главе 3.4 приводится такой пример:


ARK>Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):


ARK>
ARK>    // ...
ARK>


Если честно, то не знаю — я не автор языка и какими принципами авторы "С" руководствовались, мне не ведомо... Как уже сказал, на задворках памяти всплывает одно интервью об истории создания "С" толи Томсона, толи Кернигана, толи самого Денниса Ритчи, которое было лет 25 назад в каком-то бумажном компьютерном журнале. Там был и вопрос про switch..case и про другие "странности" реализации, например, про необходимость header-файлов... Ответ уже точно не вспомню, но точно помню, как уже сказал, что ссылались на скудность ресурсов PDP-11 и на реализацию однопроходного компилятора. А по-моему, просто им было некогда думать о будущих дискуссиях и так проще было реализовать примитивную рекурсивную функцию по константным значениям в таблице поиска по единственному ключу. Надо смотреть в исходники самого компилятора "С", чтобы точно ответить на этот вопрос, но я этим точно заниматься не буду... Думаю, всё проще! Компилятор был однопроходный, создавал таблицу символов без глубокого анализа и поиска зависимостей, надо было сделать что-то получше, чем просто батарею длинных GOTO-блоков Фортрана. Ввели switch...case, как более удобную замену фортрановским GOTO-блокам, без всяких задней мыслей...

ARK>Проще, короче, нагляднее, безопаснее.

ARK>Если обработчики веток совпадают лишь частично, внутри таких веток можно уже разрулить if-ами.
ARK>Паттерн-матчинг, конечно, круче, но про него в контексте Ц говорить, наверное, не очень уместно.

Думаю, что с "колокольни" 2015-ого гораздо проще "тыкать ухоженными пальчиками с розовыми ноготками" в бородатых авторов языка от 1972-ого года рождения для машины с 64К оперативной памяти...

Хрен знает! Так получилось! Что ж теперь делать...

З.Ы. Я вот, например, по-привычке "обволакиваю" case-блоки в {}-скобки, хотя это и необязательно. Но так мне "синтаксически юниформно"...
Отредактировано 30.12.2015 10:11 maxluzin . Предыдущая версия .
Re[5]: семантика switch/case
От: maxluzin Европа  
Дата: 30.12.15 15:37
Оценка: :)
Здравствуйте, watchmaker, Вы писали:

W>Повторюсь: нет, не поэтому
Автор: watchmaker
Дата: 16.12.15
. В языках C и C++ запятая в этом контексте не является оператором — об этом достаточно явно сказано в грамматике.

W>Так что если в новом стандарте будет введено правило, позволяющее трактовать такую конструкцию как множественный выбор, то это не сломает совместимости с предыдущими версиями или со старым кодом. Кстати говоря, в gcc и clang для таких случаев уже давным-давно есть расширение case ranges, правда оставшиеся только расширениями. Судя по всему, все неоднократные попытки изменить switch (убрать неявный fallthrough и/или добавить множественный выбор) в комитете так и не получили полной поддержки.

Ну хорошо, а как вы будете бороться с такой ситуацией?:

/** nonsence.h **/

#if defined(_ONE_)

#    define CONST_A  (1)
// ...
#    define CONST_B  (2)
#    define CONST_C  (3)
// ...
#    define CONST_D  (1)   /* Hello ! */

#else

#    define CONST_A  (1)
// ...
#    define CONST_B  (2)
#    define CONST_C  (3)
// ...
#    define CONST_D  (4)   /* OK */

#endif


#include "nonsence.h"

int main()
{
    //...
    switch (X)
    {
        case (CONST_A, CONST_B):    // 1 or 2
            foo();
            break;
        case (CONST_C, CONST_D):    // 3 or 1
            bar();
            break;
        case ((CONST_A & CONST_B) | (CONST_C & CONST_D) ):
            blah_blah();
            break;
        default:
            //...
    }
    // ...
    return (0);
}


И чё делать компилятору, когда возникает такая неоднозначность? Просто обругать и выкинуть ошибку? А если так задумано, что CONST_x могут принимать различные значения? И не добавит ли нам ещё больше головной боли такая "вольность", чем простая "switch-board" по одному константному значению?

За что боремся-то? Не понимаю...
Re[6]: семантика switch/case
От: AlexRK  
Дата: 30.12.15 20:11
Оценка: +1
Здравствуйте, ononim, Вы писали:

O>Потому что goto, работающий сключительно сверху вниз не так уж и плох. Вот если бы можно было сделать так (надо сказать я в свое время был удивлен и немного подавлен от того что так делать нельзя, ну да ладно, идеальной симметрии в этом мире не найти):


Кстати да, это мне тоже непонятно. Какой смысл защищать ущербный гото (полноценный еще ладно бы). Вот вы реализуете алгоритм на проваливаниях в свитче, а что будете делать, если при модификации существующего кода в одном месте возникнет потребность скакнуть слегка не туда, куда дозволено? (К примеру, с OVERWRITE надо будет сразу идти в POSTPONE.) Вся прекрасная высокоуровневоабстрактная картина развалится и переходим к старым добрым паскалевым кейсам и функциям?
Re[3]: семантика switch/case
От: T4r4sB Россия  
Дата: 11.01.16 11:39
Оценка: +1
Здравствуйте, MasterZiv, Вы писали:

MZ>Вообще-то чтение элементарного букваря по С (даже не по С++) уже спасает от указанных выше неожиданностей.


Да откуда ж вы берётесь...
Есть разница между "знать правило" и "всегда быть в напряге, чтобы случайно не наступить на граблю", понимаешь? В букваре много чего написано, например, что нельзя попадать ножом по пальцам при нарезке овощей, наверное все, кто режется — идиоты и букварь не читали по вашей логике, да?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: семантика switch/case
От: BulatZiganshin  
Дата: 16.12.15 10:50
Оценка:
Здравствуйте, _hum_, Вы писали:

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


case 1: case 2: ....
Люди, я люблю вас! Будьте бдительны!!!
Re: семантика switch/case
От: Nikita123 Россия  
Дата: 16.12.15 10:52
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; // prints "1",
__>    case 2 : cout << '2'; // then prints "2"
__>}
__>

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; break; // prints "1" and exits the switch
__>    case 2 : cout << '2'; break;        
__>}
__>


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

Ясно зачем. Чтобы выполнить одинаковое действие для более одного значения проверяемой переменной.
Например так:
switch(x) {
case 1:
case 2:
printf("x <= 2");
break;
case 3:
printf("x = 3");
break:
default:
printf("x > 3");
break:
}
Желаю успеха,
Никита.
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:27
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

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


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


BZ>case 1: case 2: ....


"case" — переводится как "случай", и естественная человеческая семантика подразумевает "в случае, если значение в switch совпадает cо значением случая, выполнить то, что стоит после воеточия". а на деле же:
switch(3) 
{
   case 1: // пропускает, ибо 1 != 3
   case 2: // пропускает, ибо 2 != 3
   case 3: // входит, ибо 3 == 3
   case 4: // wtf?? 4!=3, а он все равно входит
   case 5: // wtf?? 5!=3, а он все равно входит  
};

и именно потому, что семантика не естественная: case на самом деле означает не предусловие, а метку, куда должен перейти поток управления из точки switch.
Re[3]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 11:35
Оценка:
Здравствуйте, _hum_, Вы писали:

__>"case" — переводится как "случай", и естественная человеческая семантика подразумевает "в случае, если значение в switch совпадает cо значением случая, выполнить то, что стоит после воеточия". а на деле же:

__>
__>switch(3) 
__>{
__>   case 1: // пропускает, ибо 1 != 3
__>   case 2: // пропускает, ибо 2 != 3
__>   case 3: // входит, ибо 3 == 3
__>   case 4: // wtf?? 4!=3, а он все равно входит
__>   case 5: // wtf?? 5!=3, а он все равно входит  
__>};
__>

__>и именно потому, что семантика не естественная: case на самом деле означает не предусловие, а метку, куда должен перейти поток управления из точки switch.

Семантика в отрыве от break; конечно будет не естественная, да и пример switch, который Вы написали, не часто встречается на практике.
С уважением!
Re[4]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:47
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>неочевидно то, что case срабатывает не постоянно, а только один раз. то есть, это не условие входа в ветку, идущую после case (как можно было бы подумать), а некий аналог метки для перехода по goto из switch:

__>>
__>>goto (label_1) {
__>>    lalel_1:
__>>    label_2:
__>>    label_3:
__>>    label_4:
__>>        std::cout << '1';
__>>    break;
__>>}
__>>// prints 1
__>>


X>Тут немного иначе нужно думать, немного другими абстракциями.

X>Есть набор состояний, допустим S = { State1, State2, ... , StateN }
X>Есть регистр (R), который содержит текущее состояние.
X>На группу состояний S' — подгруппа S, или на одно любое состояние из S
X>есть набор инструкций или одна инструкция.
X>После завершения работы инструкций, выходим из обработки состояний или продолжаем работу.
X>В принципе если представить такими абстракциями, то более понятно все будет.

и вы, серьезно, считаете это "естественной семантикой"
Re[4]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:50
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>"case" — переводится как "случай", и естественная человеческая семантика подразумевает "в случае, если значение в switch совпадает cо значением случая, выполнить то, что стоит после воеточия". а на деле же:

__>>
__>>switch(3) 
__>>{
__>>   case 1: // пропускает, ибо 1 != 3
__>>   case 2: // пропускает, ибо 2 != 3
__>>   case 3: // входит, ибо 3 == 3
__>>   case 4: // wtf?? 4!=3, а он все равно входит
__>>   case 5: // wtf?? 5!=3, а он все равно входит  
__>>};
__>>

__>>и именно потому, что семантика не естественная: case на самом деле означает не предусловие, а метку, куда должен перейти поток управления из точки switch.

X>Семантика в отрыве от break; конечно будет не естественная, да и пример switch, который Вы написали, не часто встречается на практике.


так поэтому я и обратил на эту штуку внимание только сейчас, после долгих лет знакомства, ибо всегда и всюду автоматом включался break, который делал семантику естественной. а тут решил сэкономить в угоду читабельности, и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан
Re[3]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:51
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


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


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


BZ>>case 1: case 2: ....


TB>Для этого нафиг не нужна такая ублюдочная семантика. Если бы в кейсах можно было ставить диапазоны и перечисления, то это бы покрыло этот случай.


вот-вот
Re[5]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 11:52
Оценка:
Здравствуйте, _hum_, Вы писали:

X>>Тут немного иначе нужно думать, немного другими абстракциями.

X>>Есть набор состояний, допустим S = { State1, State2, ... , StateN }
X>>Есть регистр (R), который содержит текущее состояние.
X>>На группу состояний S' — подгруппа S, или на одно любое состояние из S
X>>есть набор инструкций или одна инструкция.
X>>После завершения работы инструкций, выходим из обработки состояний или продолжаем работу.
X>>В принципе если представить такими абстракциями, то более понятно все будет.

__>и вы, серьезно, считаете это "естественной семантикой"


Смотря что считать естественной семантикой.
Если есть goto, label и switch case break default.
То наверно не стоит одно с другим мешать.

P.S. Х... тоже гвозди можно забивать, но никто этого не делает.
С уважением!
Re[5]: семантика switch/case
От: CEMb  
Дата: 16.12.15 11:52
Оценка:
Здравствуйте, _hum_, Вы писали:

__>и вы, серьезно, считаете это "естественной семантикой"


Можно, наверно, спросить у автора, почему оно так.
Как мне думается, были рассмотрены всевозможные варианты разбора ветвлений, самый часто используемый был реализован самым простым синтаксисом. Нормально же?
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:55
Оценка:
Здравствуйте, xobotik, Вы писали:

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


X>>>Тут немного иначе нужно думать, немного другими абстракциями.

X>>>Есть набор состояний, допустим S = { State1, State2, ... , StateN }
X>>>Есть регистр (R), который содержит текущее состояние.
X>>>На группу состояний S' — подгруппа S, или на одно любое состояние из S
X>>>есть набор инструкций или одна инструкция.
X>>>После завершения работы инструкций, выходим из обработки состояний или продолжаем работу.
X>>>В принципе если представить такими абстракциями, то более понятно все будет.

__>>и вы, серьезно, считаете это "естественной семантикой"


X>Смотря что считать естественной семантикой.

X>Если есть goto, label и switch case break default.
X>То наверно не стоит одно с другим мешать.

X>P.S. Х... тоже гвозди можно забивать, но никто этого не делает.


естественная — та, что естественна для человека, читающего программу. если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается о ее семантике. теперь проделайте то же самое со switch/case — угу.
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 11:57
Оценка:
Здравствуйте, CEMb, Вы писали:

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


__>>и вы, серьезно, считаете это "естественной семантикой"


CEM>Можно, наверно, спросить у автора, почему оно так.

CEM>Как мне думается, были рассмотрены всевозможные варианты разбора ветвлений, самый часто используемый был реализован самым простым синтаксисом. Нормально же?
самый часто используемый — это выбор из альтернатив, то есть swith/case-break.
Re[7]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:01
Оценка:
Здравствуйте, _hum_, Вы писали:

__>естественная — та, что естественна для человека, читающего программу. если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается о ее семантике. теперь проделайте то же самое со switch/case — угу.


Если брать пример Ваш:
switch (1) {
    case 1: std::cout << '1';
    case 2: std::cout << '2';
}

Что тут не естественного?
В Вашей некой системе состояние 1, интерпретируется как:
1) выполнение двух инструкций std::cout << '1'; std::cout << '2';
2) Или как ошибка, потому что забыли break;

В случае один — Вы немного криво пишите, лучше написать
switch (1) {
    case 1:
    case 2: 
        std::cout << '1';
        std::cout << '2';
}

В случае 2 — Вы немного криво пишите.
С уважением!
Отредактировано 16.12.2015 12:02 xobotik . Предыдущая версия . Еще …
Отредактировано 16.12.2015 12:02 xobotik . Предыдущая версия .
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:07
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>естественная — та, что естественна для человека, читающего программу. если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается о ее семантике. теперь проделайте то же самое со switch/case — угу.


X>Если брать пример Ваш:

X>
X>switch (1) {
X>    case 1: std::cout << '1';
X>    case 2: std::cout << '2';
X>}
X>

X>Что тут не естественного?

о-ё. то, что читается она как "выбрать из перечисленных ниже случаев случай, подходящий под указанный", а работает совсем по-другому — нет никаких случаев, есть точка входа в тело, заключенное межу скобками после switch, потому надо было бы писать goto вместо switch и label вместо case.
Re[5]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:09
Оценка:
Здравствуйте, _hum_, Вы писали:

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


А можно реальный пример, где Вы решили сэкономить в угоду читабельности, убрав пару break.
С уважением!
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:23
Оценка:
Здравствуйте, xobotik, Вы писали:

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


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


X>А можно реальный пример, где Вы решили сэкономить в угоду читабельности, убрав пару break.


да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

swicth(a)
{
case 1: x = 1001; break;
case 2: x = 4002; break;
};

swicth(a)
{
case 1: x = 1001; 
case 2: x = 4002; 
};

(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)
Re[3]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:25
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

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


TB>>Правка: перечисления в кейсах нужны, но для них можно было сделать более вменяемую реализацию без таких вот сюрпризов. Например

TB>>
TB>>case 1,3,5..8 :
TB>>


MD>Запятая уже занята для других целей



case {1,3,5..8} :
Re[7]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 12:29
Оценка:
Здравствуйте, _hum_, Вы писали:

__>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

__>

__>swicth(a)
__>{
__>case 1: x = 1001; break;
__>case 2: x = 4002; break;
__>};

__>swicth(a)
__>{
__>case 1: x = 1001; 
__>case 2: x = 4002; 
__>};
__>

__>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)

По Вашему мнению это один и тот же код, но на самом деле совершенно разный.
Перечитайте про абстракцию еще разок: http://rsdn.ru/forum/cpp/6281323.1
Автор: xobotik
Дата: 16.12.15


В первом случае, если а = 1, то x = 1001, если a = 2, то x = 4002.
Во втором случае, если а = 1 или а = 2, x = 4002.
(если подробнее, если а = 1, то x принимает значение 1001, затем x принимает значение 4002,
если a = 2, то x = 4002)
С уважением!
Re[7]: семантика switch/case
От: savitar  
Дата: 16.12.15 12:33
Оценка:
Здравствуйте, _hum_, Вы писали:

__>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

__>

__>swicth(a)
__>{
__>case 1: x = 1001; break;
__>case 2: x = 4002; break;
__>};

__>swicth(a)
__>{
__>case 1: x = 1001; 
__>case 2: x = 4002; 
__>};
__>

__>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)

возможно вынос в отдельную ф-цию поможет, типа такого:
int get_x_from_a(int a)
{
    switch (a)
    {
    case 1: return 1001;
    case 2: return 4002;
    // и т.д.
    };
}
Отредактировано 16.12.2015 12:36 savitar . Предыдущая версия .
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 12:34
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:

__>>

__>>swicth(a)
__>>{
__>>case 1: x = 1001; break;
__>>case 2: x = 4002; break;
__>>};

__>>swicth(a)
__>>{
__>>case 1: x = 1001; 
__>>case 2: x = 4002; 
__>>};
__>>

__>>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)

X>По Вашему мнению это один и тот же код, но на самом деле совершенно разный.

X>Перечитайте про абстракцию еще разок: http://rsdn.ru/forum/cpp/6281323.1
Автор: xobotik
Дата: 16.12.15


X>В первом случае, если а = 1, то x = 1001, если a = 2, то x = 4002.

X>Во втором случае, если а = 1 или а = 2, x = 4002.
X>(если подробнее, если а = 1, то x принимает значение 1001, затем x принимает значение 4002,
X>если a = 2, то x = 4002)
я теперь уже знаю, что это разный код. вы спрашивали, зачем мне захотелось отказаться от break, вот я вам и привел пример, как выглядит текст с брейком и без оного.
Re[10]: оффтоп
От: _hum_ Беларусь  
Дата: 16.12.15 12:59
Оценка:
Здравствуйте, xobotik, Вы писали:

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


__>>безусловно, но использовать более одного return — это моветон


X>И когда это стало моветоном ? Можно пруфы?


wiki/Return_statement
Languages with an explicit return statement create the possibility of multiple return statements in the same function. Whether or not that is a good thing is controversial.

Strong adherents of structured programming make sure each function has a single entry and a single exit (SESE). It has thus been argued[6] that one should eschew the use of the explicit return statement except at the textual end of a subroutine, considering that, when it is used to "return early", it may suffer from the same sort of problems that arise for the GOTO statement.

Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:00
Оценка:
Здравствуйте, xobotik, Вы писали:

X> А как тогда реализовать спуск вниз через case'ы?


Действительно, раз томсон и ричи реализовали этот спуск именно так, то это значит, что никаких иных способов в приниципе существовать не может и никто до иных способов никогда не смог бы додуматься
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[7]: семантика switch/case
От: B0FEE664  
Дата: 16.12.15 13:00
Оценка:
Здравствуйте, _hum_, Вы писали:

__> если написано if(a > 0) then print("positive integer"), то даже человек, первый раз читающий эту конструкцию, догадается ...


что ось абсцисс направлена влево.
И это вы называете естественным?
И каждый день — без права на ошибку...
Re[12]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:00
Оценка:
Здравствуйте, xobotik, Вы писали:

X>Для меня человеческая семантика:


Крестодеформация
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[11]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 13:04
Оценка:
Здравствуйте, T4r4sB, Вы писали:

X>> А как тогда реализовать спуск вниз через case'ы?


TB>Действительно, раз томсон и ричи реализовали этот спуск именно так, то это значит, что никаких иных способов в приниципе существовать не может и никто до иных способов никогда не смог бы додуматься


А кто говорит, что в принципе иных способов не может и никто до иных способов никогда не смог бы додуматься?
С уважением!
Re[12]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 13:08
Оценка:
Здравствуйте, xobotik, Вы писали:

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


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


X>Вы скорее всего выразили отсутствие знаний в этом вопросе. То что Вы не знаете не является не очевидным.


X>Для меня человеческая семантика:

X>
X>swicth(a) {
X>    case 1: x = 1001; break;
X>    case 2: x = 4002; break;
X>};
X>


речь шла о человечности семантики для случая без break
Re[13]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 13:18
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Ну тогда я не понимаю смысла задавать такие вопросы, "а как иначе реализовать". Неужели сходу не придумать 100500 вариантов? Да как угодно, явным словом continue, явным словом goto metka, или ещё каким явным словом, очевидно же, что такой случай более редкий, и значит именно в этом более редком случае и надо заставлять писать какое-нибудь слово.


100500 вариантов работающих вариантов, на реальном компиляторе? Или вы про абстрактный компилятор в сферическом вакууме ?
С уважением!
Re[9]: семантика switch/case
От: B0FEE664  
Дата: 16.12.15 13:26
Оценка:
Здравствуйте, _hum_, Вы писали:

__>юмор оценил



__>а если уж дотошничать, то это алгебраическая запись, а не геометрическая — спросите у школьников, как записывается условие, число больше нуля, они вам скажут, что именно так, а не (0 < a) "нуль меньше числа"

Программирование — это не математика. Например, манера ставить ноль слева от сравнения два раза меня спасала от ошибки.
А выражение if(0 < a) можно прочитать, как "если ноль слева от a..."

  на всякий случай, а то ещё скажите, что не видели:
do {
    if ( data == &array[o1])
    {
        operation = O1;
        break;
    }
    if ( data == &array[o2])
    {
        operation = O2;
        break;
    }
    ...
    if ( data == &array[on])
    {
        mOperation = ON;
        break;
    }
}
while(false);


PS Think different: if blue is the sky...
И каждый день — без права на ошибку...
Re[14]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:29
Оценка:
Здравствуйте, xobotik, Вы писали:

X>100500 вариантов работающих вариантов, на реальном компиляторе? Или вы про абстрактный компилятор в сферическом вакууме ?


Причём тут реализованные варианты, ты спрашивал про то, как иначе реализовать протекание, если сделать выход-по-умолчанию.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 16.12.15 13:31
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


Человека в детстве запугала учительница в школе, что если он будет использовать goto, то она его будет бить линейкой по пальцам, а если её не будет, то ему откусит голову велоцираптор. Школу он законил, учительницы, бьющей по пальцам, уже нет, но психическая травма осталась на всю жизнь, поэтому он и делает такие "циклы".
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[4]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 13:33
Оценка:
Здравствуйте, ononim, Вы писали:

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

__>>>>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/...
O>>>А зачем switch-у семантика как у if-ов если она уже есть у if-ов?
__>>затем же, зачем есть три конструкции для организации цикла — для более экспрессивного задания алгоритма.
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} ), а оказалось все не так

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


ну, как бы да, для меня это пример из области программирования на "высокоуровневом ассемблере".
Re[10]: семантика switch/case
От: _hum_ Беларусь  
Дата: 16.12.15 13:44
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


__>>юмор оценил

BFE>

__>>а если уж дотошничать, то это алгебраическая запись, а не геометрическая — спросите у школьников, как записывается условие, число больше нуля, они вам скажут, что именно так, а не (0 < a) "нуль меньше числа"

BFE>Программирование — это не математика. Например, манера ставить ноль слева от сравнения два раза меня спасала от ошибки.

речь про естественность текста для чтения, а не про "ошибкоустойчивость" я в курсе про эту защиту (но я ее применяю только для сравнения, где вместо "==" легко может появиться "=")

BFE>А выражение if(0 < a) можно прочитать, как "если ноль слева от a..."


так тоже редко говорят, когда имеют в виду положительность числа

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


это я совсем не понял, к чему вы привели. что за жах?
Re[15]: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 13:45
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


X>>100500 вариантов работающих вариантов, на реальном компиляторе? Или вы про абстрактный компилятор в сферическом вакууме ?


TB>Причём тут реализованные варианты, ты спрашивал про то, как иначе реализовать протекание, если сделать выход-по-умолчанию.


Я просто не понял о чем Вы, теперь понял.
P.S. Для бурных фантазий есть же "Философия программирования".
С уважением!
Re: семантика switch/case
От: xobotik Россия  
Дата: 16.12.15 14:12
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; // prints "1",
__>    case 2 : cout << '2'; // then prints "2"
__>}
__>

__>
__>switch(1) 
__>{
__>    case 1 : cout << '1'; break; // prints "1" and exits the switch
__>    case 2 : cout << '2'; break;        
__>}
__>


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


Пользуйся раз тебе не удобно:
#define SCASE_CONTINUE(x) case x:
#define SCASE(x, func) case x: func(); break
#define SCASEARG(x, func) case x: func(x); break
#define SDEFAULT() default: break

// example
void printX() {
    std::cout << "in god we trust!" << std::endl; // C++
}
void printArg(int arg) {
    std::cout << std::to_string(arg) << std::endl; // C++
}
int main() {
    int x = 1;
    switch (x) {
        SCASE_CONTINUE(1);
        SCASE_CONTINUE(2);
        SCASE_CONTINUE(3);
        SCASE(4, printX);
        SCASE(5, printX);
        SCASEARG(10, printArg);
        SDEFAULT();
    }
}

Переписать, что на C++ и на C взлетит =)
P.S. Если честно, то это 3.14здец.
С уважением!
Отредактировано 16.12.2015 14:25 xobotik . Предыдущая версия .
Re[11]: семантика switch/case
От: B0FEE664  
Дата: 16.12.15 14:13
Оценка:
Здравствуйте, _hum_, Вы писали:

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

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

Если на него посмотреть, то можно предположить, почему switch-case такой, какой он есть. — это с одной стороны.
С другой стороны, именно такого switch'а в C нет из-за не константности в правой части сравнения.
И каждый день — без права на ошибку...
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[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[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>Но в рамках академического спора о достоинствах языка можно и поговорить о кривизне.


Заведи тему в "КСВ", там тебя поддержат.
Re: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 09:42
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

Надо было быть внимательным еще в школе, когда бэйсик на z80 теребил

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

С чего это она неочевидная? Всё вполне логично тут. Есть if и есть switch и они обязаны себя вести по разному, ибо в противном случае чтото из них не нужно.
switch полезен тем, что можно писать так, что код сможет выполняться не полностью. Например каттотак
switch(flag)
{
    case doFullWork:      { checkLastWork(); clearTemp(); }
    case doOptimizedWork: { clearCaches(); }
    case justDoIt:        { doWork(); }
}

На if'ах забодаешься подобное кратко писать.
Matrix has you...
Отредактировано 17.12.2015 9:44 Sheridan . Предыдущая версия .
Re[17]: семантика switch/case
От: B0FEE664  
Дата: 17.12.15 09:58
Оценка:
Здравствуйте, _hum_, Вы писали:

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

Это канонический приём любителей макросов. Можно даже сказать, не побоюсь этого слова, паттерн.

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

BFE>>А разве он проще?
__>да, места меньше занимает (нет кучи сравнений и скобок)
Тут я потерял нить рассуждений.
И каждый день — без права на ошибку...
Re[4]: семантика switch/case
От: AlexRK  
Дата: 17.12.15 11:04
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>>>switch полезен тем, что можно писать так, что код сможет выполняться не полностью. Например каттотак

ARK>> Жуть. Goto в худшем виде.
S>Аргументы?

Точно такие же скачки сквозь разные ветки управления. Сишный оператор switch не является оператором структурного программирования.
Чтобы "код выполнялся не полностью", существуют функции.

S>Как по мне, так тут всё чётко понятно как код исполняться будет. goto в этом отношении даёт возможность выстрелить себе в ногу, а switch нет


Не дает? Ну-ну. В действительности здесь прямо-таки раздолье для стрельбы по ногам. Позже постараюсь нарыть ссылку про ошибку в маршрутизаторе, написанном на С, из-за пропущенного break в свитче, приведшую к параличу линии связи. Сейчас не могу вспомнить, где читал.

ARK>>Вообще, конструкция switch в том виде, в каком она есть в С/C++,

S>Он такой везде

Да нет, такого нет больше нигде (ну, лично я не помню других подобных языков).
Re[5]: семантика switch/case
От: ononim  
Дата: 17.12.15 11:26
Оценка:
S>>>>switch полезен тем, что можно писать так, что код сможет выполняться не полностью. Например каттотак
ARK>>> Жуть. Goto в худшем виде.
S>>Аргументы?
ARK>Точно такие же скачки сквозь разные ветки управления. Сишный оператор switch не является оператором структурного программирования.
ARK>Чтобы "код выполнялся не полностью", существуют функции.
А чтобы работать как if существует if

S>>Как по мне, так тут всё чётко понятно как код исполняться будет. goto в этом отношении даёт возможность выстрелить себе в ногу, а switch нет

ARK>Не дает? Ну-ну. В действительности здесь прямо-таки раздолье для стрельбы по ногам. Позже постараюсь нарыть ссылку про ошибку в маршрутизаторе, написанном на С, из-за пропущенного break в свитче, приведшую к параличу линии связи. Сейчас не могу вспомнить, где читал.
goto вполне безобиден в некоторых редких случаях, по сути эквивалентных try..finally, goto реализованный в switch'е — это как раз формальные рамки, ограничивающие возможность его применения только этими случаями. Альтернативный вариант — функция с множеством return'ов, как вы написали выше, но во многих случаях это слишком долго печатать, и программисты начинают порождать гораздо более вычурные, но локальные конструкции. switch в этом плане разумный компромисс, единственный минус — новички, которые приходят из других ЯП в которых свич — это разновидность ифа — у них трещат шаблоны.
Как много веселых ребят, и все делают велосипед...
Re[6]: семантика switch/case
От: AlexRK  
Дата: 17.12.15 11:56
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>>>Аргументы?

ARK>>Точно такие же скачки сквозь разные ветки управления. Сишный оператор switch не является оператором структурного программирования.
S>Нет. При отсутствии break он будет выполняться строго сверху вниз, начиная от сработавшего case.

Строго вниз, строго вверх, нестрого назад — не имеет значения. Это разные ветки управления.

ARK>>Чтобы "код выполнялся не полностью", существуют функции.

S>Ну да, вместо читаемого кода плодить кучу функций и оборачивать всё if'ами. Годный подход, ага.

Какую кучу функций? Функций должно быть столько, сколько надо.
Вместо вашего монстра код должен быть таким:
void DoFullWork()
{
    checkLastWork();
    clearTemp();
    DoOptimizedWork();
}

void DoOptimizedWork()
{
    ClearCaches();
    DoWork();
}

void DoWork()
{
    ...
}



S>switch в данном случае не при чём. Надо быть просто внимательным.


Абсолютно все языковые конструкции — это об удобстве и внимательности. Некоторые удобны, некоторые нет. А некоторые просто уродливы, как сишный switch.

ARK>>>>Вообще, конструкция switch в том виде, в каком она есть в С/C++,

S>>>Он такой везде
ARK>>Да нет, такого нет больше нигде (ну, лично я не помню других подобных языков).
S>Примеры?

C#, Go, Ruby, Pascal, Ada, Eiffel...

UPD. Сейчас посмотрел, в Java и JavaScript break необязателен, хотя мне казалось, что был обязателен. Теперь я знаю 4 языка с таким оператором.
Отредактировано 17.12.2015 12:08 AlexRK . Предыдущая версия .
Re[6]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 11:59
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>switch в данном случае не при чём. Надо быть просто внимательным.


Убивает такой подход.
Езда на лошади стоя тут ни при чём. Надо лишь не падать вперёд, назад, влево и вправо.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[6]: семантика switch/case
От: AlexRK  
Дата: 17.12.15 12:03
Оценка:
Здравствуйте, ononim, Вы писали:

O>goto вполне безобиден в некоторых редких случаях, по сути эквивалентных try..finally, goto реализованный в switch'е — это как раз формальные рамки, ограничивающие возможность его применения только этими случаями. Альтернативный вариант — функция с множеством return'ов, как вы написали выше, но во многих случаях это слишком долго печатать, и программисты начинают порождать гораздо более вычурные, но локальные конструкции. switch в этом плане разумный компромисс, единственный минус — новички, которые приходят из других ЯП в которых свич — это разновидность ифа — у них трещат шаблоны.


Сишный switch не вписывается в структурное программирование. На мой взгляд, одно это уже означает, что конструкция слегка "попахивает".

Ну и, конечно, возникает вопрос, какое поведение по умолчанию считать более ожидаемым — выход или переход на следующую ветку? Какой подход соответствует принципу наименьшего удивления? Некоторые люди считают, что первый (я в их числе). Создатели Ц решили, что второй.
Re[9]: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 13:46
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>Убивает как раз подход "я не хочу ничего думать, я не хочу учиться, я не хочу быть внимательным, дайте мне такую штуку, чтобы вместо меня работала".

TB>Понятно, что без труда не выловишь и рыбку из пруда. Но в то же время, не стоит оправдывать совершенно идиотские недоработки...
Это НЕ недоработки, друг мой. Такое поведение заложено в свитч изначально. И оно, наравне с if, позволяет гибко управлять обработкой условий.
Matrix has you...
Re[8]: о0
От: AlexRK  
Дата: 17.12.15 14:11
Оценка:
Здравствуйте, Sheridan, Вы писали:

ARK>>Строго вниз, строго вверх, нестрого назад — не имеет значения. Это разные ветки управления.

S>С этого места поподробнее: с какого времени порядок следования инструкций перестал иметь значение?

Секунду, причем тут порядок следования инструкций?

S>А чего это забываем, что эти функции вызывать, обернув if'ами?


С того, что их не надо оборачивать if'ами. В изначальном коде про if'ы ничего не было. Мой вариант полностью эквивалентен вашему первому варианту.

S>Неужели ты будешь жертвовать читабельностью кода, будешь запутывать код только ради того чтобы свитч не применять? Да ладно?


Я использую switch, когда надо. Но всегда без переходов в соседние ветки.

S>Более того, добавляем еще три флага и рисуем еще три функции? Еще больше запутываем?


Флаги это вообще зло. И если мы "добавляем еще три флага", то это повод задуматься о рефакторинге говнокода.

Кстати, а если мы вдруг заходим добавить в DoFullWork в самом конце еще Print (но не в doOptimizedWork и не в justDoIt)?

ARK>>UPD. Сейчас посмотрел, в Java и JavaScript break необязателен, хотя мне казалось, что был обязателен. Теперь я знаю 4 языка с таким оператором.

S>Проверил? Да ладно? о0
S>Я вот действительно проверил

И? Результат проверки чем-то отличается?

ARK>>>>Да нет, такого нет больше нигде (ну, лично я не помню других подобных языков).

S>>>Примеры?
ARK>>C#, Go, Ruby, Pascal, Ada, Eiffel...
S>Точно так же проверял, как и жабаскрипт?

По сути есть что сказать?
Отредактировано 17.12.2015 14:13 AlexRK . Предыдущая версия .
Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 14:28
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Это НЕ недоработки, друг мой. Такое поведение заложено в свитч изначально. И оно, наравне с if, позволяет гибко управлять обработкой условий.


Разве не очевидно, что можно придумать куда менее травмоопасные способы добиться той же или даже большей гибкости?
Зачем такие грабли жирные повесили? Ради чего? Только по скудоумию двух кульных какир из 70го года.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 14:31
Оценка:
Здравствуйте, neFormal, Вы писали:

F>а как же?

F>https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%94%D0%B0%D1%84%D1%84%D0%B0

Оно компилируется в Студии-2003 О_О
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: семантика switch/case
От: ononim  
Дата: 17.12.15 14:38
Оценка:
__>безусловно, но использовать более одного return — это моветон
Это многое объясняет Впрочем возможно для С это действительно не комильфо, но тут... та-да! на сцену на белом ишаке выезжает С++ с RAII наперевес
Как много веселых ребят, и все делают велосипед...
Re[9]: о0
От: Sheridan Россия  
Дата: 17.12.15 14:48
Оценка:
Здравствуйте, AlexRK, Вы писали:

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


ARK>>>Строго вниз, строго вверх, нестрого назад — не имеет значения. Это разные ветки управления.

S>>С этого места поподробнее: с какого времени порядок следования инструкций перестал иметь значение?
ARK>Секунду, причем тут порядок следования инструкций?

Строго вниз, строго вверх, нестрого назад — не имеет значения.


S>>А чего это забываем, что эти функции вызывать, обернув if'ами?

ARK>С того, что их не надо оборачивать if'ами. В изначальном коде про if'ы ничего не было. Мой вариант полностью эквивалентен вашему первому варианту.
Дааа? switch у меня обрабатывает условие, а не if. Или ты не в курсе, что свич по условию работает?

S>>Неужели ты будешь жертвовать читабельностью кода, будешь запутывать код только ради того чтобы свитч не применять? Да ладно?

ARK>Я использую switch, когда надо. Но всегда без переходов в соседние ветки.
В подавляющем большинстве случаев его так и используют

S>>Более того, добавляем еще три флага и рисуем еще три функции? Еще больше запутываем?

ARK>Флаги это вообще зло. И если мы "добавляем еще три флага", то это повод задуматься о рефакторинге говнокода.
Да и код вообще зло. Лучше на канары, правда?

ARK>Кстати, а если мы вдруг заходим добавить в DoFullWork в самом конце еще Print (но не в doOptimizedWork и не в justDoIt)?

Про подобные варианты разворачивания событий я писал уже давно
Автор: Sheridan
Дата: 27.08.15

Я в курсе, что когда возразить нечего — один из вариантов попробовать положить соперника на лопатки — усложнять задачу до тех пор, пока собеседник не скажет "В этом случае да, мой инструмент не подходит". Обычно после этого инструмент соперника объявляется гавном.


ARK>>>UPD. Сейчас посмотрел, в Java и JavaScript break необязателен, хотя мне казалось, что был обязателен. Теперь я знаю 4 языка с таким оператором.

S>>Проверил? Да ладно? о0
S>>Я вот действительно проверил
ARK>И? Результат проверки чем-то отличается?
По поведению от c\c++? Нет. О чём я тебе и говорил

ARK>>>>>Да нет, такого нет больше нигде (ну, лично я не помню других подобных языков).

S>>>>Примеры?
ARK>>>C#, Go, Ruby, Pascal, Ada, Eiffel...
S>>Точно так же проверял, как и жабаскрипт?
ARK>По сути есть что сказать?
По сути я только и говорю. А у тебя?
Matrix has you...
Re[11]: мда...
От: Sheridan Россия  
Дата: 17.12.15 14:52
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>Это НЕ недоработки, друг мой. Такое поведение заложено в свитч изначально. И оно, наравне с if, позволяет гибко управлять обработкой условий.

TB>Разве не очевидно, что можно придумать куда менее травмоопасные способы добиться той же или даже большей гибкости?
TB>Зачем такие грабли жирные повесили? Ради чего? Только по скудоумию двух кульных какир из 70го года.

Я не могу понять что в switch не так, чем он травмоопасен? Или ты про ситуацию "студент недоучка спотыкается об switch и ломает ногу каждые три часа"? Ради этого надо вонь поднимать и switch ругать? А может всётаки студенту вторую ногу сломать, чтобы выучил наконец язык, на котором собрался писать?
А когда "студент" споткнется об
if(val=16) {...}

, тогда нужно еще и обработку условий коричнево помазать, так что ли?
Matrix has you...
Re[10]: о0
От: AlexRK  
Дата: 17.12.15 15:04
Оценка:
Здравствуйте, Sheridan, Вы писали:

ARK>>>>Строго вниз, строго вверх, нестрого назад — не имеет значения. Это разные ветки управления.

S>>>С этого места поподробнее: с какого времени порядок следования инструкций перестал иметь значение?
ARK>>Секунду, причем тут порядок следования инструкций?
S>

S>Строго вниз, строго вверх, нестрого назад — не имеет значения.


Ну вы представляете, что такое структурное программирование?
Понимаете, что "порядок следования инструкций" и "направление безусловного перехода" — это вещи не связанные?

S>>>А чего это забываем, что эти функции вызывать, обернув if'ами?

ARK>>С того, что их не надо оборачивать if'ами. В изначальном коде про if'ы ничего не было. Мой вариант полностью эквивалентен вашему первому варианту.
S>Дааа? switch у меня обрабатывает условие, а не if. Или ты не в курсе, что свич по условию работает?

Причем тут "switch у меня обрабатывает условие"?
У вас нет _вызова_ функции и в вашем коде нет ничего, что указывало бы на то, откуда этот флаг берется.

S>>>Неужели ты будешь жертвовать читабельностью кода, будешь запутывать код только ради того чтобы свитч не применять? Да ладно?

ARK>>Я использую switch, когда надо. Но всегда без переходов в соседние ветки.
S>В подавляющем большинстве случаев его так и используют

Нет, в подавляющем большинстве случаев его так не используют.

S>>>Более того, добавляем еще три флага и рисуем еще три функции? Еще больше запутываем?

ARK>>Флаги это вообще зло. И если мы "добавляем еще три флага", то это повод задуматься о рефакторинге говнокода.
S>Да и код вообще зло. Лучше на канары, правда?

Демагогия. Могу только лишь еще раз сказать, что флаги — это зло.

ARK>>Кстати, а если мы вдруг заходим добавить в DoFullWork в самом конце еще Print (но не в doOptimizedWork и не в justDoIt)?

S>Про подобные варианты разворачивания событий я писал уже давно
Автор: Sheridan
Дата: 27.08.15

S>

S>Я в курсе, что когда возразить нечего — один из вариантов попробовать положить соперника на лопатки — усложнять задачу до тех пор, пока собеседник не скажет "В этом случае да, мой инструмент не подходит". Обычно после этого инструмент соперника объявляется гавном.


Да-да. А кто начал усложнять про "добавляем еще три флага"? "Не лучше ль, кума, на себя оборотиться?" (с)

ARK>>>>UPD. Сейчас посмотрел, в Java и JavaScript break необязателен, хотя мне казалось, что был обязателен. Теперь я знаю 4 языка с таким оператором.

S>>>Проверил? Да ладно? о0
S>>>Я вот действительно проверил
ARK>>И? Результат проверки чем-то отличается?
S>По поведению от c\c++? Нет. О чём я тебе и говорил

Так вот, языков таких мне известно 4 штуки. Языков с другим поведением — гораздо больше.

ARK>>По сути есть что сказать?

S>По сути я только и говорю. А у тебя?

По сути: C#, Go, Ruby, Pascal, Ada, Eiffel — обладают семантикой, отличной от C/C++.
Re[7]: Теперь понятно.
От: Sheridan Россия  
Дата: 17.12.15 15:05
Оценка:
Здравствуйте, _hum_, Вы писали:

X>>А можно реальный пример, где Вы решили сэкономить в угоду читабельности, убрав пару break.

__>да в любом коде лишняя торчащая и затеняющая основное значение конструкция — это вред. а тут этот break:
__>

__>swicth(a)
__>{
__>case 1: x = 1001; break;
__>case 2: x = 4002; break;
__>};

__>swicth(a)
__>{
__>case 1: x = 1001; 
__>case 2: x = 4002; 
__>};
__>

__>(особенно, когда кейсов много, и ошибиться в них ни в коем случае нельзя)


Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.
И тогда у тебя не будет случаться таких факапов, как случился в твоём проекте с switch. Надеюсь, ты успел понять где у тебя ошибка перед сдачей релиза, а не после...
Matrix has you...
Re[11]: о0
От: Sheridan Россия  
Дата: 17.12.15 15:19
Оценка:
Здравствуйте, AlexRK, Вы писали:

S>>

S>>Строго вниз, строго вверх, нестрого назад — не имеет значения.

ARK>Ну вы представляете, что такое структурное программирование?
ARK>Понимаете, что "порядок следования инструкций" и "направление безусловного перехода" — это вещи не связанные?
Я — да. А ты понимаешь, что код не следует загромождать лишними сущностями, если можно написать лакончно, это будет читабельно и будет работать?

S>>Дааа? switch у меня обрабатывает условие, а не if. Или ты не в курсе, что свич по условию работает?

ARK>Причем тут "switch у меня обрабатывает условие"?
ARK>У вас нет _вызова_ функции и в вашем коде нет ничего, что указывало бы на то, откуда этот флаг берется.
То есть мне нужно создать новый проект, написать кучу кода, обложить тестами и выложить на гитхаб дабы было понятно откуда в переменной появляется значение? Или мы всетаки опустим незначащие сущности?

S>>>>Неужели ты будешь жертвовать читабельностью кода, будешь запутывать код только ради того чтобы свитч не применять? Да ладно?

ARK>>>Я использую switch, когда надо. Но всегда без переходов в соседние ветки.
S>>В подавляющем большинстве случаев его так и используют
ARK>Нет, в подавляющем большинстве случаев его так не используют.
Погоди. Давай расставим точки везде. Я соглашаюсь с тобой, что в подавляющем большинстве случаев везде в case'ах присутствует break, что делает невозможным переход в низлежайший case.
А ты ВНЕЗАПНО со мной не соглашаешься.
Спор ради спора?

S>>>>Более того, добавляем еще три флага и рисуем еще три функции? Еще больше запутываем?

ARK>>>Флаги это вообще зло. И если мы "добавляем еще три флага", то это повод задуматься о рефакторинге говнокода.
S>>Да и код вообще зло. Лучше на канары, правда?
ARK>Демагогия. Могу только лишь еще раз сказать, что флаги — это зло.
И переменные — зло. И функции — зло. Классы тоже зло... Строго говоря, ООП целиком зло. А по чесноку — программирование зло из зол. Лучше на канары. Да?

ARK>>>Кстати, а если мы вдруг заходим добавить в DoFullWork в самом конце еще Print (но не в doOptimizedWork и не в justDoIt)?

S>>Про подобные варианты разворачивания событий я писал уже давно
Автор: Sheridan
Дата: 27.08.15

S>>

S>>Я в курсе, что когда возразить нечего — один из вариантов попробовать положить соперника на лопатки — усложнять задачу до тех пор, пока собеседник не скажет "В этом случае да, мой инструмент не подходит". Обычно после этого инструмент соперника объявляется гавном.

ARK>Да-да. А кто начал усложнять про "добавляем еще три флага"? "Не лучше ль, кума, на себя оборотиться?" (с)
У меня нет цели доказать что switch истина в последней инстанции и все обязаны его применять. Я всего лишь пытаюсь рассказать о том, что его семантика имеет смысл и что есть варианты использовать эту семантику на пользу себе. А тут же в ветках, в том числе и у тебя, просматривается "свитч — гавно, его клепали неучи и вообще его использовать — зло как и goto"

ARK>>>>>UPD. Сейчас посмотрел, в Java и JavaScript break необязателен, хотя мне казалось, что был обязателен. Теперь я знаю 4 языка с таким оператором.

S>>>>Проверил? Да ладно? о0
S>>>>Я вот действительно проверил
ARK>>>И? Результат проверки чем-то отличается?
S>>По поведению от c\c++? Нет. О чём я тебе и говорил
ARK>Так вот, языков таких мне известно 4 штуки. Языков с другим поведением — гораздо больше.
ARK>По сути: C#, Go, Ruby, Pascal, Ada, Eiffel — обладают семантикой, отличной от C/C++.
Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.
Matrix has you...
Re[11]: семантика switch/case
От: neFormal Россия  
Дата: 17.12.15 15:25
Оценка:
Здравствуйте, T4r4sB, Вы писали:

F>>а как же?

F>>https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%94%D0%B0%D1%84%D1%84%D0%B0
TB>Оно компилируется в Студии-2003 О_О

ага, лёгкий способ завалить человека на собеседовании.
наравне с `a[b]==b[a]`
...coding for chaos...
Re[8]: о0
От: _hum_ Беларусь  
Дата: 17.12.15 15:25
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


S>>>>>Аргументы?


S>А чего это забываем, что эти функции вызывать, обернув if'ами? Давай я за тебя

S>
S>void DoFullWork()
S>{
S>    checkLastWork();
S>    clearTemp();
S>    DoOptimizedWork();
S>}

S>void DoOptimizedWork()
S>{
S>    ClearCaches();
S>    DoWork();
S>}

S>void DoWork()
S>{
S>    ...
S>}

S>int main()
S>{
S>    someFlagEnum flag = getFlag();
S>    if(flag==doFullWork)      { DoFullWork(); }
S>        if(flag==doOptimizedWork) { DoOptimizedWork(); }
S>        if(flag==justDoIt)        { DoWork(); }
S>}
S>

S>Неужели ты будешь жертвовать читабельностью кода, будешь запутывать код только ради того чтобы свитч не применять? Да ладно?
S>Неужели вариант со свичем НАСТОЛЬКО хуже?
S>
S>switch(getFlag())
S>{
S>    case doFullWork:      { checkLastWork(); clearTemp(); }
S>    case doOptimizedWork: { clearCaches(); }
S>    case justDoIt:        { doWork(); }
S>}
S>

S>Более того, добавляем еще три флага и рисуем еще три функции? Еще больше запутываем?
S>Ты случаем не споришь только ради спора?

Ваш код ужасен для чтения и сопровождения (в нем логика работы завязана на goto-style, из-за чего фрагменты кода становятся сильно связанными между собою). И не надо плодить лишних процедур, достаточно поступить следующим образом:

void VoidLastWork(void){ checkLastWork(); clearTemp(); }
 void ClearCashes(){ clearCaches(); }
 void LaunchWorkProcedure(){doWork();}

int main()
{
    someFlagEnum flag = getFlag();

    if(flag == doFullWork)      { VoidLastWork(); ClearCashes(); LaunchWorkProcedure();}
    else
    if(flag == doOptimizedWork) { ClearCashes();LaunchWorkProcedure(); }    
    else 
    if(flag == justDoIt)        { LaunchWorkProcedure(); }
}


Теперь представьте, что у вас добавился флаг "doSpecialWork", предполагающий выполнение полной работы, но с пропуском этапа очистки кэша. В каком варианте его легче будет реализовать?
Re[9]: о0
От: Sheridan Россия  
Дата: 17.12.15 15:36
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Ваш код ужасен для чтения и сопровождения (в нем логика работы завязана на goto-style, из-за чего фрагменты кода становятся сильно связанными между собою). И не надо плодить лишних процедур, достаточно поступить следующим образом:

Да я уже понял. Наилучшее ружжо &mdash; ваше. Остальные &mdash; брёвна.

__>Теперь представьте, что у вас добавился флаг "doSpecialWork", предполагающий выполнение полной работы, но с пропуском этапа очистки кэша. В каком варианте его легче будет реализовать?

А теперь представьте, что спор не о флагах, а о возможностях switch. Ой, погодите, а ведь именно так оно и есть о0
Matrix has you...
Re[12]: о0
От: AlexRK  
Дата: 17.12.15 16:05
Оценка:
Здравствуйте, Sheridan, Вы писали:

ARK>>Ну вы представляете, что такое структурное программирование?

ARK>>Понимаете, что "порядок следования инструкций" и "направление безусловного перехода" — это вещи не связанные?
S>Я — да. А ты понимаешь, что код не следует загромождать лишними сущностями, если можно написать лакончно, это будет читабельно и будет работать?

То, что сегодня лаконично и читабельно, завтра окажется говнокодом.
Для того, чтобы формализовать правила, что лаконично, а что нет, изобрели структурное программирование. Сишный свитч нарушает правила структурного программирования.

S>То есть мне нужно создать новый проект, написать кучу кода, обложить тестами и выложить на гитхаб дабы было понятно откуда в переменной появляется значение? Или мы всетаки опустим незначащие сущности?


Мой код _полностью_ эквивалентен вашему первоначальному варианту. Этот факт вам понятен?

Если выбор осуществляется именно флагом, то да, можно и нужно использовать и свитч. В сочетании с набором функций. Fallthrough при этом не нужен.

S>Погоди. Давай расставим точки везде. Я соглашаюсь с тобой, что в подавляющем большинстве случаев везде в case'ах присутствует break, что делает невозможным переход в низлежайший case.

S>А ты ВНЕЗАПНО со мной не соглашаешься.

А, да. Тут моя ошибка, прошу прощения. Я неправильно понял.

S>У меня нет цели доказать что switch истина в последней инстанции и все обязаны его применять. Я всего лишь пытаюсь рассказать о том, что его семантика имеет смысл и что есть варианты использовать эту семантику на пользу себе. А тут же в ветках, в том числе и у тебя, просматривается "свитч — гавно, его клепали неучи и вообще его использовать — зло как и goto"


Ну, смысл можно найти во всем. Всегда найдется некоторый контекст, в котором некоторое средство будет удобно и адекватно.
А здесь говорится, что выбор создателей С был, по мнению некоторых людей, не вполне удачен. Для языка общего назначения, которым С и стал по факту.

S>Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.


Хорошо. Я сделаю это сегодня, чуть позже.
Re[10]: о0
От: _hum_ Беларусь  
Дата: 17.12.15 16:11
Оценка:
Здравствуйте, Sheridan, Вы писали:

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



__>>Теперь представьте, что у вас добавился флаг "doSpecialWork", предполагающий выполнение полной работы, но с пропуском этапа очистки кэша. В каком варианте его легче будет реализовать?

S>А теперь представьте, что спор не о флагах, а о возможностях switch. Ой, погодите, а ведь именно так оно и есть о0

вопрос не о возможностях switch, а о его семантике — насколько она удачна, чтобы писать легко читаемый и модифицируемый код.
вы привели пример, который, по-вашему, хорошо иллюстрирует достоинства свитча. я вам показал, что такой код не обладает модифицируемостью, и в то же время не намного сокращает объем кода (в отличие от if-подхода). что еще?
Re[10]: семантика switch/case
От: DarkEld3r  
Дата: 17.12.15 17:01
Оценка:
Здравствуйте, neFormal, Вы писали:

F>а как же?

F>https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%94%D0%B0%D1%84%D1%84%D0%B0
А ничего что там написано следующее?

В современных решениях польза от применения метода Даффа сомнительна. Метод затрудняет работу оптимизирующих компиляторов и предсказателя переходов.[1] Например, после удаления кода Даффа из XFree86 версии 4.0, бинарные файлы уменьшились примерно на 0,5 МБ, и сервер стал загружаться быстрее.


Да и разве тут кто-то ратует за полный запрет такой возможности? Просто можно было бы ввести ключевое слово типа fallthrough для явного указания намерений.
Re[13]: о0
От: Sheridan Россия  
Дата: 17.12.15 17:24
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>А, да. Тут моя ошибка, прошу прощения. Я неправильно понял.



ARK>Ну, смысл можно найти во всем. Всегда найдется некоторый контекст, в котором некоторое средство будет удобно и адекватно.



S>>Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.

ARK>Хорошо. Я сделаю это сегодня, чуть позже.


зы Сначала начал писать много текста, но потом дочитал до адекватных ответов и потёр все нафиг. Спасибо.
Matrix has you...
Re[11]: о0
От: Sheridan Россия  
Дата: 17.12.15 17:28
Оценка:
Здравствуйте, _hum_, Вы писали:

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

Ну есть свич и есть if. У нас есть выбор, это же хорошо!

__>вы привели пример, который, по-вашему, хорошо иллюстрирует достоинства свитча. я вам показал, что такой код не обладает модифицируемостью, и в то же время не намного сокращает объем кода (в отличие от if-подхода). что еще?

Естественно, на каждую хитрую ... найдется ... с винтом, это отрицать нельзя. Да и языки, в том числе и ц++, достаточно выразительные, чтобы одно и то же можно было сделать множеством способов.
Я всего лишь показал наглядный пример. Не больше, не меньше.
Matrix has you...
Re[11]: семантика switch/case
От: neFormal Россия  
Дата: 17.12.15 17:36
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

F>>а как же?

F>>https://ru.wikipedia.org/wiki/%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_%D0%94%D0%B0%D1%84%D1%84%D0%B0
DE>А ничего что там написано следующее?

ничего, я разрешаю.
...coding for chaos...
Re[5]: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 18:30
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

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


ARK>>>Вообще, конструкция switch в том виде, в каком она есть в С/C++,

S>>Он такой везде
DE>Нет.

DE>В D каждый case должен оканчиваться или break или "goto case" (явное указание провалиться дальше). То есть случайно пропустить break не получится. Ну и там есть некоторое количество специальных случаев когда break не требуется, например, если выбрасывается исключение.

Тогда там switch не нужен, он становится if'ом при таком раскладе, но с другим синтаксисом и позволяет не писать города из if else.

DE>В Swift и Go есть специальное ключевое слово fallthrough, а break используется по умолчанию и явно писать его не требуется.

То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.

DE>Некоторые языки (например, Rust) обходятся без switch как такового и вместе этого предлагают паттерн матчинг. Естественно, без fallthrough.

Интересный язык. Буду чего нибудь писать в плане скриптов — попробую как нибудь.
Впрочем, ихний match хотя и мощный, но fallthrough действительно, похоже, нет и они этим показательно гордятся, гм.

Что ж. Я погорячился про "все". Пусть будет "многие"
Matrix has you...
Re[5]: семантика switch/case
От: ononim  
Дата: 17.12.15 18:50
Оценка:
Исторический контекст
Как много веселых ребят, и все делают велосипед...
Re[12]: мда...
От: T4r4sB Россия  
Дата: 17.12.15 19:08
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Я не могу понять что в switch не так, чем он травмоопасен? Или ты про ситуацию "студент недоучка спотыкается об switch и ломает ногу каждые три часа"?


А что такого опасного в езде на лошади стоя? Просто не падай вперёд, назад, влево и вправо...

S>Ради этого надо вонь поднимать и switch ругать?


Писать бряк после каждой ветки — это неинтуитивно и противоестественно.

S>А когда "студент" споткнется об

S>
S>if(val=16) {...}
S>

S>, тогда нужно еще и обработку условий коричнево помазать, так что ли?

Компилятор обычно предупреждает об этом. Зря, наверное, это предупреждение ввели, ведь на этом только недоучки спотыкаются. А реальным пацанам ничего не стоит всегда каждый секунду быть на 360 градусов внимательными.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[12]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 19:09
Оценка:
Здравствуйте, neFormal, Вы писали:

F>ага, лёгкий способ завалить человека на собеседовании.


Зачем? Если очень хочется не принимать человека, то можно и так сказать.
А если собеседующий всерьёз считает, что знание подобных конструкций нужно программисту, то он идиот.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[8]: Теперь понятно.
От: T4r4sB Россия  
Дата: 17.12.15 19:11
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.


Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[12]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 19:13
Оценка:
Здравствуйте, ononim, Вы писали:

O>Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю"


Напарывался несколько раз (слава богу, последствия вылезали сразу), так же и на =/== (но тут компилятор ругается), и один раз на
 
int& i1 = a[f(1)], i2 = a[f(2)], i3 = a[f(3)];
// что-то делаем над i1,i2,i3
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[12]: о0
От: T4r4sB Россия  
Дата: 17.12.15 19:15
Оценка:
Здравствуйте, Sheridan, Вы писали:

ARK>>По сути: C#, Go, Ruby, Pascal, Ada, Eiffel — обладают семантикой, отличной от C/C++.

S>Примеры, камрад, примеры. Наговнокодь, как я, немножко кода по типу того что я показал. А лучше 1-в-1. И покажи результат.

Примеры чего? В гугле же полно примеров кода.
Или примеры, как в этих языках выкручиваются, когда нужно "протекание"? Хз, не знаю, писал на Паскале, ни разу не нужно было такого. Вообще не припомню ни одного раза.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[6]: семантика switch/case
От: T4r4sB Россия  
Дата: 17.12.15 19:19
Оценка:
Здравствуйте, Sheridan, Вы писали:

DE>>В Swift и Go есть специальное ключевое слово fallthrough, а break используется по умолчанию и явно писать его не требуется.

S>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.

Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть. Мелочь какая. И совершенно ненужная, реальные пацаны же не падают. Зря они так сделали короче.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[12]: семантика switch/case
От: _NN_  
Дата: 17.12.15 20:24
Оценка:
Здравствуйте, ononim, Вы писали:

O>Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю"

Тут либо предельная внимательность либо везение либо статический анализатор.
Если ничего нет, то нарваться довольно легко.
Вон тут недавно у нас в Java коде пропустили 'break' и нашлось совершенно случайно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[13]: семантика switch/case
От: ononim  
Дата: 17.12.15 20:53
Оценка:
O>>Ни разу не помню чтоб напарывался на эти грабли. То есть если и напарывался — то совершенно несеръезно. В тоже время пользуюсь этой гибкостью регулярно. ИМХО это примерно грабли такого же рода как "ух ты, а оказывается поинтер после free не становится равным нулю"
_NN>Тут либо предельная внимательность либо везение либо статический анализатор.
Даже не знаю. Я иногда когда попадется интересная закавыка на работе в проекте бывает кодю дома т.к. только дома можно сосредоточиться толком. (А на работе я потом это время компенсирую нифиганеделаньем, приступы коего случаются не реже чем приступы хочупокодитьдома ). А т.к. тащить домой компилябельное дерево проекта а) нельзя б) лень — тупо пишу код без компиляции. Причем зачастую пишу в FAR'е. Бывает тыщу — другую строчек могу так накатать, потом принести и, исправив мелкие опечатки, — скомпилять и оно таки в большинстве случаев сразу работает как надо. И я бы не сказал что прям таки внимательно пишу код, скорее это дело практики, а мозги при этом заняты не анализом кода, а анализом алгоритма. Это как разговаривать на человеческом языке — вначале внимательно тупишь над артиклями временами и тп, а потом с практикой нужные времена зона Брока генерит на автомате, без вмешательства высших отделов психики.

_NN>Если ничего нет, то нарваться довольно легко.

_NN>Вон тут недавно у нас в Java коде пропустили 'break' и нашлось совершенно случайно.
Обычно ошибки такого класса я отлавливаю ассертами, коих пихаю в неимоверных количествах. Причем, активными и в релизе, ибо нефиг.
Как много веселых ребят, и все делают велосипед...
Re[14]: семантика switch/case
От: _NN_  
Дата: 17.12.15 20:58
Оценка:
Здравствуйте, ononim, Вы писали:

_NN>>Если ничего нет, то нарваться довольно легко.

_NN>>Вон тут недавно у нас в Java коде пропустили 'break' и нашлось совершенно случайно.
O>Обычно ошибки такого класса я отлавливаю ассертами, коих пихаю в неимоверных количествах. Причем, активными и в релизе, ибо нефиг.
Ну в том случае это бы не помогло
Там было что-то в стиле

switch(v)
{
case X: doX();
case Y: doY(); break;
case Z: doZ(); break;
default: throw new Exception();
}


К счастью хотя бы в C# без 'break' нельзя писать, а если уж нужно то явно пиши goto case.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[13]: о0
От: Sheridan Россия  
Дата: 17.12.15 21:58
Оценка:
Здравствуйте, AlexRK, Вы писали:


ARK>C#: https://ideone.com/BMkFax

ARK>break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
Да. Приходится извращаться, чтобы добиться поведения ц++ https://ideone.com/w2eCYM

ARK>Go: https://ideone.com/CvtZwE

ARK>break нет, хотя есть его противоположность — fallthrough. Что с точки зрения выбора по умолчанию, на мой взгляд, гораздо лучше.
Ну, про зеркало я уже говорил выше...

ARK>Ruby: https://ideone.com/o6U0ra

ARK>Pascal: https://ideone.com/JWO3wT
ARK>Ada: https://ideone.com/3NwBYB
ARK>В этих языках ни break, ни аналогов, ни антиподов нет. Все в точном соответствии с примитивом "ветвление" в структурном программировании. Так что эти примеры демонстрируют только синтаксис.
То есть тот же if, только разветвленный. Печаль
Matrix has you...
Re[9]: Теперь понятно.
От: Sheridan Россия  
Дата: 17.12.15 22:10
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
Matrix has you...
Re[7]: семантика switch/case
От: Sheridan Россия  
Дата: 17.12.15 22:12
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть.

Всего лишь надо сделать над собой усилие и выучить, наконец то, язык, на котором пишешь.

TB>Мелочь какая. И совершенно ненужная, реальные пацаны же не падают. Зря они так сделали короче.

Какая у тебя цель? Потрындеть? Тогда не со мной.
Matrix has you...
Re[6]: семантика switch/case
От: DarkEld3r  
Дата: 18.12.15 00:04
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Тогда там switch не нужен, он становится if'ом при таком раскладе, но с другим синтаксисом и позволяет не писать города из if else.

Не согласен — есть "goto case", который как раз к следующему case переходит. Просто это надо указывать явно (что хорошо). Если не написать ни default ни goto case, то компилятор даст по рукам.
В любом случае, switch штука удобная даже без возможности "проваливаться". Кстати, он в D, в отличии от C/C++, со строками работать умеет.

S>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.

Да, "зеркальное поведение", но я согласен с автором темы с тем, что break писать приходится куда чаще, чем сознательно его опускать. Хотя и не помню когда уже допускал такую ошибку, тем более, что ловится легко, как правило. Но всё равно считаю такое умолчание более разумным и удобным.

Ну и в C# тоже такое же поведение, только там вместо fallthrough "полноценный goto" по кейсам.

S>Впрочем, ихний match хотя и мощный, но fallthrough действительно, похоже, нет и они этим показательно гордятся, гм.

У них и goto нет.
Относительно матча — просто он действительно сильно мощнее свитча и большинство вариантов использования плохо применимы с fallthrough. Например:
match val {
    A(x) => ... ,
    B(x, y) => ... ,
    C(x, y, z) => ... ,
 }
Re[13]: о0
От: DarkEld3r  
Дата: 18.12.15 00:13
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>C#: https://ideone.com/BMkFax

ARK>break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
Вот так не ругается:
https://ideone.com/zVqfmz
Странно, в общем. Хотя я С# не знаю.
Re[7]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 04:41
Оценка:
Здравствуйте, DarkEld3r, Вы писали:

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


S>>Тогда там switch не нужен, он становится if'ом при таком раскладе, но с другим синтаксисом и позволяет не писать города из if else.

DE>Не согласен — есть "goto case", который как раз к следующему case переходит. Просто это надо указывать явно (что хорошо). Если не написать ни default ни goto case, то компилятор даст по рукам.
Ну, тут дело привычки скорее.

DE>В любом случае, switch штука удобная даже без возможности "проваливаться". Кстати, он в D, в отличии от C/C++, со строками работать умеет.

Вот да, строк в ц++ не хватает. Но с другой стороны сравнение строк — достаточно дорогая операция и я стараюсь вообще их не сравнивать без необходимости.

S>>То есть просто зеркальное поведение от ц++, так? Левая и правая руки. Если так, то пример не показателен. В ц++ надо явно проставлять бряки, когда хочешь сработку только одного case, а тут наоборот, надо явно указать fallthrough если нужна сработка нескольких по порядку.

DE>Да, "зеркальное поведение", но я согласен с автором темы с тем, что break писать приходится куда чаще, чем сознательно его опускать. Хотя и не помню когда уже допускал такую ошибку, тем более, что ловится легко, как правило. Но всё равно считаю такое умолчание более разумным и удобным.
Опять же, сила привычки. Я привык так, другие этак...

DE>Ну и в C# тоже такое же поведение, только там вместо fallthrough "полноценный goto" по кейсам.

Что, кстати, вряд ли будет использовано, ибо слово goto мало кто терпит в своём коде почему то...

S>>Впрочем, ихний match хотя и мощный, но fallthrough действительно, похоже, нет и они этим показательно гордятся, гм.

DE>У них и goto нет.
DE>Относительно матча — просто он действительно сильно мощнее свитча и большинство вариантов использования плохо применимы с fallthrough. Например:
DE>
DE>match val {
DE>    A(x) => ... ,
DE>    B(x, y) => ... ,
DE>    C(x, y, z) => ... ,
DE> }
DE>

Да я повкуривал руст. Интересный язык, мне будет интересно на ём чего нибудь пописать.
Matrix has you...
Re[14]: о0
От: AlexRK  
Дата: 18.12.15 06:46
Оценка:
Здравствуйте, Sheridan, Вы писали:

ARK>>C#: https://ideone.com/BMkFax

ARK>>break есть, но он обязателен, без него не скомпилируется. То есть по сути break в C# бессмысленен.
S>Да. Приходится извращаться, чтобы добиться поведения ц++ https://ideone.com/w2eCYM

Да, из кейса можно выйти по goto, continue, return, throw, или сунуть туда бесконечный цикл. Тогда можно обойтись без брейка. Но это все же явно происходит.

ARK>>В этих языках ни break, ни аналогов, ни антиподов нет. Все в точном соответствии с примитивом "ветвление" в структурном программировании. Так что эти примеры демонстрируют только синтаксис.

S>То есть тот же if, только разветвленный. Печаль

Отличие от if в том, что мы имеем дело не с кучей условий, а с кучей значений. Пишется компактнее, ну и предназначено для другого в общем-то.
Re[15]: о0
От: Sheridan Россия  
Дата: 18.12.15 06:48
Оценка:
Здравствуйте, AlexRK, Вы писали:

ARK>Да, из кейса можно выйти по goto, continue, return, throw, или сунуть туда бесконечный цикл. Тогда можно обойтись без брейка. Но это все же явно происходит.

ARK>Отличие от if в том, что мы имеем дело не с кучей условий, а с кучей значений. Пишется компактнее, ну и предназначено для другого в общем-то.

Мне всё равно непонятно, чем ц++ свич не угодил
Matrix has you...
Re[10]: Теперь понятно.
От: T4r4sB Россия  
Дата: 18.12.15 07:42
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


S>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.

Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[8]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 07:43
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


TB>>Да, "всего лишь" зеркальное поведение. Всего лишь убрали необходимость постоянно делать над собой усилие, чтобы не упасть.

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

Ну вот вызубришь ты наизусть фразу "при езде на лошади стоя надо не падать вперёд, назад, влево и вправо". И всё, теперь ты не будешь падать с лошади при езде стоя. Ведь ты же запомнил правила! А физических ограничений человеческого мозга — их не, не существует, они только у лохов.

S>Какая у тебя цель? Потрындеть? Тогда не со мной.


Доказать, что все "я никогда на этом не ошибаюсь" либо врут, потому что похвастаться охота, крутым себя показать, либо... не очень опытны. Это как "я использую сырые массивы и указатели, потому что только лохи ошибаются в индексе и забывают написать free". Кульные какиры такие. Они думают, что они умнее этих перестраховывающихся "ламеров", лол.
То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 18.12.2015 7:47 T4r4sB . Предыдущая версия .
Re[8]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 07:50
Оценка:
Здравствуйте, ononim, Вы писали:

O>А потом набегут питонисты, и начнут говорить что проваливающийся в пределах отступа if — плохо, что они по привычке написали

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

Вот это не очень распространённый косяк. Хотя против обязательных скобочек ничего не имею, при условии, что введут слово elseif (иначе будет уродливый уголок).
Понятно, что некоторые вещи вообще нельзя никак обезопасить, например, опачатаешься и напишешь * вместо + (хотя и там можно ввести контроль за физической размерностью величин, ну или + вместо -), но это не повод оправдывать совсем откровенные идиотизмы в дизайне языка.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[11]: Теперь понятно.
От: Sheridan Россия  
Дата: 18.12.15 08:26
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
TB>Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
Могу в тебя твою же фразу отразить
Matrix has you...
Re[12]: Теперь понятно.
От: T4r4sB Россия  
Дата: 18.12.15 08:36
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


S>>>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>>>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
TB>>Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
S>Могу в тебя твою же фразу отразить

Не можешь, потому что аналогию начал я.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 08:54
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


TB>Ну вот вызубришь ты наизусть фразу "при езде на лошади стоя надо не падать вперёд, назад, влево и вправо". И всё, теперь ты не будешь падать с лошади при езде стоя. Ведь ты же запомнил правила!

Достал ты с лошадью. Неверная аналогия. Верной была бы если бы разговор шел о "А чего там программировать то? Научись на кнопки жать и всё! Вот клавиатура, вот мышь, вот монитор. Нет, вот это — клавиатура. Ага. Программируй."

TB>А физических ограничений человеческого мозга — их не, не существует, они только у лохов.

Ну приблизительно както как бы да. Всё зависит от заинтересованности в обучении по большому счёту.

S>>Какая у тебя цель? Потрындеть? Тогда не со мной.

TB>Доказать, что все "я никогда на этом не ошибаюсь" либо врут, потому что похвастаться охота, крутым себя показать, либо... не очень опытны.
Ну гдето рядом я сдал назад, согласившись, что не во всех языках поведение switch такое же, как и у ц
Но относительно свича неправ ты. Тут не надо гнать на язык. Надо тупо знать особенности. Пишешь на языке? Знай его. Не знаешь языка — не пиши на нём. Плохо знаешь и пишешь — изучай и запоминай.
Я когда то на форте немного писал. Своеобразный язык. Категорически своеобразный. И ничо, и не трындел на форумах, а обложился доками и вкурил. Питон в своё время вкурил тупо из интереса, пэхапэ. И ничё.
Что с тобой то не так, чего ты нервничаешь о поведениии свича?

TB>Это как "я использую сырые массивы и указатели, потому что только лохи ошибаются в индексе и забывают написать free". Кульные какиры такие. Они думают, что они умнее этих перестраховывающихся "ламеров", лол.

А чего сразу не "Я открываю блокнот, пишу в туда символы и сохраняю как app.exe, а остальные лохи"?

TB>То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.

Это не проблема языка, это проблема программистов, которым трудно правила запомнить.
Matrix has you...
Re[13]: Теперь понятно.
От: Sheridan Россия  
Дата: 18.12.15 08:55
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>>>>>Друг мой, изучай инструмент, с которым работаешь, мой тебе совет.

TB>>>>>Точно, я упал с лошади потому, что не прочитал мануал, в котором сказано, что с неё не надо падать. А вовсе не потому, что удерживать равновесие нереально.
S>>>>Да. Только мануал был о том, что на лошади надо сидеть а не стоять.
TB>>>Опять началось "на самом деле аналогия не такая, а такая", не люблю этот трёп. Я надеюсь, что ты понял аналогию, так что давай не надо.
S>>Могу в тебя твою же фразу отразить
TB>Не можешь, потому что аналогию начал я.
А кто мне запретит?
Matrix has you...
Re[6]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 09:24
Оценка:
Здравствуйте, ononim, Вы писали:

O>Последний раз когда писал под МК (на C, да) N было равно 0.008

Завидую.
На самом деле руки чешутся чтото вот такое пописать, но задач таких нет. А чешется не так сильно, чтобы придумывать себе задачу и закупаться оборудованием
Matrix has you...
Re[10]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 09:31
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Достал ты с лошадью. Неверная аналогия. Верной была бы если бы разговор шел о "А чего там программировать то? Научись на кнопки жать и всё! Вот клавиатура, вот мышь, вот монитор. Нет, вот это — клавиатура. Ага. Программируй."


Аналогию ты понял, а вот это "ой, там не так, а так" — это отмазки.

S>Ну приблизительно както как бы да. Всё зависит от заинтересованности в обучении по большому счёту.


Я не знаю, может ты киборг, но это уже из серии "раз я такой, значит все такие".

S>Ну гдето рядом я сдал назад, согласившись, что не во всех языках поведение switch такое же, как и у ц

S>Но относительно свича неправ ты. Тут не надо гнать на язык. Надо тупо знать особенности. Пишешь на языке? Знай его. Не знаешь языка — не пиши на нём. Плохо знаешь и пишешь — изучай и запоминай.

Ты уже страницу путаешь слова "знать правило" и "быть всё время внимательным, как оператор ядерного реактора". Ты можешь выучить хоть как все правила, но в плохом языке они не спасут тебя от ошибок, которые компилятор пропустит. Потому что ошибки бывают случайные, а не от незнания.

S>Что с тобой то не так, чего ты нервничаешь о поведениии свича?


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

TB>>Это как "я использую сырые массивы и указатели, потому что только лохи ошибаются в индексе и забывают написать free". Кульные какиры такие. Они думают, что они умнее этих перестраховывающихся "ламеров", лол.

S>А чего сразу не "Я открываю блокнот, пишу в туда символы и сохраняю как app.exe, а остальные лохи"?

Потому что тех, кто пишет символы, я не встречал, а любителей сырых массивов и сырыых указателей я навидался немало. Аргументация абсолютно такая же — они уверены, что всё смогут контролировать, а кто не может (или просто считает, что голову можно забить более интересными вещами) — те просто программировать не умеют.

TB>>То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.

S>Это не проблема языка, это проблема программистов, которым трудно правила запомнить.

Да ты один в белом коне походу. Только непонятно, как же такой исключительный ты до сих пор не может понять разницу между способностью выучить правило и способностью всегда быть начеку. По твоей логике, когда человеку падает кирпич на голову, то это лишь потому, что он не знал, что от кирпичей по голове становится плохо, а если человек в гололёд поскользнулся и упал, то это потому, что он не знает, что не надо падать.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[18]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:18
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


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

BFE>Это канонический приём любителей макросов. Можно даже сказать, не побоюсь этого слова, паттерн.

ааа, вот теперь, полазив по нету, понял, для чего это делается. что ж вы сразу-то не сказали, что это не описка, и там действительно должен быть while(false), а сам блок "фиктивного цикла" выполняет двоякую роль
1) позволяет реализовать подобие goto за счет срабатывания break;
2) позволяет заворачивать в макрос блок кода с возможностью использования этого макроса в коде в варианте с точкой запятой (например, if(<condition>) MACROS; else <bla-bla>)
Re[6]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:20
Оценка:
Здравствуйте, VladFein, Вы писали:

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


__>>... и на тебе — "все, что вы знали о switch — неправда" . потому и предупреждаю других граждан


VF>Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch


ну я же не знал. почему вы полагаете, что мой случай уникален?
Re[11]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 10:48
Оценка:
Здравствуйте, T4r4sB, Вы писали:

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


S>>Достал ты с лошадью. Неверная аналогия. Верной была бы если бы разговор шел о "А чего там программировать то? Научись на кнопки жать и всё! Вот клавиатура, вот мышь, вот монитор. Нет, вот это — клавиатура. Ага. Программируй."

TB>Аналогию ты понял, а вот это "ой, там не так, а так" — это отмазки.
Я то аналогию понял, но она неверная.

S>>Ну приблизительно както как бы да. Всё зависит от заинтересованности в обучении по большому счёту.

TB>Я не знаю, может ты киборг, но это уже из серии "раз я такой, значит все такие".
Я не киборг, я обычный админ.

S>>Ну гдето рядом я сдал назад, согласившись, что не во всех языках поведение switch такое же, как и у ц

S>>Но относительно свича неправ ты. Тут не надо гнать на язык. Надо тупо знать особенности. Пишешь на языке? Знай его. Не знаешь языка — не пиши на нём. Плохо знаешь и пишешь — изучай и запоминай.
TB>Ты уже страницу путаешь слова "знать правило" и "быть всё время внимательным, как оператор ядерного реактора". Ты можешь выучить хоть как все правила, но в плохом языке они не спасут тебя от ошибок, которые компилятор пропустит. Потому что ошибки бывают случайные, а не от незнания.
То есть ты хочешь сказать, что отсутствие бряка в свиче — ошибка??? о0
Это не ошибка. На самом деле и пресловутая if(val=15) {} не ошибка. ВНЕЗАПНО, да? Работать начинает по другому, да. Но не ошибка.

S>>Что с тобой то не так, чего ты нервничаешь о поведениии свича?

TB>Я не люблю ходить по помещению, в котором по полу раскиданы грабли. Да, я знаю, что на грабли наступать не надо, и знаю их расположение, но от этого блин не становится так же легко, как если этих грабель не было. И если я наступлю на граблю, то это не потому, что я якобы не знаю, что на грабли наступать не надо, понимаешь?
Жизнь вообще полна грабель. Я вот давеча переходил с bacela на bareos у себя в организации. Потратил целый вечер, чтобы выяснить, что мануал устанувки его webui — гавно и половина инфы там либо лишняя, либо неверная. В итоге за полчаса установил этот webui в лоб, тупо читая логи nginx и подсовывая то что оно хочет.
Грабель не надо бояться — это ценный опыт. Главное — запоминать их расположение. И изучать карты, составленные другими.

S>>А чего сразу не "Я открываю блокнот, пишу в туда символы и сохраняю как app.exe, а остальные лохи"?

TB>Потому что тех, кто пишет символы, я не встречал, а любителей сырых массивов и сырыых указателей я навидался немало. Аргументация абсолютно такая же — они уверены, что всё смогут контролировать, а кто не может (или просто считает, что голову можно забить более интересными вещами) — те просто программировать не умеют.
Я встречал, правда начинающих.
А насчет использования чегототам... Работает? Да. Значит пусть. А то, что остальных считают быдлом — так это их проблемы. Они то среди быдла живут

TB>>>То, что в компилятор вставили такое предупреждение, говорит о том, что проблема действительно распространённая.

S>>Это не проблема языка, это проблема программистов, которым трудно правила запомнить.
TB>Да ты один в белом коне походу.
Я вообще админ.

TB>Только непонятно, как же такой исключительный ты до сих пор не может понять разницу между способностью выучить правило и способностью всегда быть начеку.

Ты верно подметил, это две разных способности. И первая очень и очень помогает в реализации второй.

TB>По твоей логике, когда человеку падает кирпич на голову, то это лишь потому, что он не знал, что от кирпичей по голове становится плохо, а если человек в гололёд поскользнулся и упал, то это потому, что он не знает, что не надо падать.

А ты, оказывается, любитель пограничных аналогий и сравнений
Matrix has you...
Re[7]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 10:51
Оценка:
Здравствуйте, _hum_, Вы писали:

VF>>Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch

__>ну я же не знал. почему вы полагаете, что мой случай уникален?
Вот не обижайся пожалуйста, но просто это как бы базовые знания. Возможно просто мимо тебя оно проскочило: на лекцию из за болезни не сходил или ктото из страуструпа пару листов гуашью залил...
Matrix has you...
Re[8]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 10:59
Оценка:
Здравствуйте, Sheridan, Вы писали:

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


VF>>>Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch

__>>ну я же не знал. почему вы полагаете, что мой случай уникален?
S>Вот не обижайся пожалуйста, но просто это как бы базовые знания. Возможно просто мимо тебя оно проскочило: на лекцию из за болезни не сходил или ктото из страуструпа пару листов гуашью залил...
я же объяснил выше, почему оно прошло мимо меня (и, думаю, не только меня) — если вы не системный программист, и сипользуете с/c++ как язык высокого уровня, то вам и в голову не может прийти, что за простым switch/case могут скрываться какие-то системные вещи типа goto-переходов по меткам.
а в учебниках к нему отношение не как к goto ("внимание!" "осторожно!" "нарушение структурного программирования!" "чревато!", "лучше не использовать без крайне йнеобходимости" и т.п.), а как к обычному if — типичные примерчики с break-ами.
а сам человек догадаться до того, что там что-то приницпиально отличное от if не может из-за дурацкого названия.
Re[12]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 11:14
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>То есть ты хочешь сказать, что отсутствие бряка в свиче — ошибка??? о0

S>Это не ошибка. На самом деле и пресловутая if(val=15) {} не ошибка. ВНЕЗАПНО, да? Работать начинает по другому, да. Но не ошибка.

По-моему, ты ударился в демагогию.

S>Грабель не надо бояться — это ценный опыт. Главное — запоминать их расположение. И изучать карты, составленные другими


Знание об их расположении не спасает от случайностей.

S>Я встречал, правда начинающих.

S>А насчет использования чегототам... Работает? Да. Значит пусть. А то, что остальных считают быдлом — так это их проблемы. Они то среди быдла живут

Угу, вот такая же уверенность в том, что он никогда не ошибается.

S>Я вообще админ.


То есть программы пишешь лишь утилитки на тыщу строк?

S>Ты верно подметил, это две разных способности. И первая очень и очень помогает в реализации второй.


Тогда почему ты всерьёз считаешь, что люди не ставят бряк потому, что не в курсе насчёт протеканий?

S>А ты, оказывается, любитель пограничных аналогий и сравнений


Я просто не знаю, как ещё объяснить.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: семантика switch/case
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.15 11:22
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:


А на самом деле, switch/case работает, как goto по таблице. Сюрприз, да?

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


Оно бывает нужно, повесить одно и то же действие на несколько case, или по какому-то case сделать что-нибудь полезное, и провалиться в следующий case.
Re[13]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 11:39
Оценка:
Здравствуйте, T4r4sB, Вы писали:


S>>То есть ты хочешь сказать, что отсутствие бряка в свиче — ошибка??? о0

S>>Это не ошибка. На самом деле и пресловутая if(val=15) {} не ошибка. ВНЕЗАПНО, да? Работать начинает по другому, да. Но не ошибка.
TB>По-моему, ты ударился в демагогию.
Да нет, это не демагогия...

S>>Грабель не надо бояться — это ценный опыт. Главное — запоминать их расположение. И изучать карты, составленные другими

TB>Знание об их расположении не спасает от случайностей.
Не спасало, не спасает и не будет спасать. При любом раскладе

S>>Я встречал, правда начинающих.

S>>А насчет использования чегототам... Работает? Да. Значит пусть. А то, что остальных считают быдлом — так это их проблемы. Они то среди быдла живут
TB>Угу, вот такая же уверенность в том, что он никогда не ошибается.
Я не высказывал такой уверенности

S>>Я вообще админ.

TB>То есть программы пишешь лишь утилитки на тыщу строк?
Не совсем.

S>>Ты верно подметил, это две разных способности. И первая очень и очень помогает в реализации второй.

TB>Тогда почему ты всерьёз считаешь, что люди не ставят бряк потому, что не в курсе насчёт протеканий?
Я так не считаю. У топикстартера такая ситуация

S>>А ты, оказывается, любитель пограничных аналогий и сравнений

TB>Я просто не знаю, как ещё объяснить.
Да я не против
Matrix has you...
Re[8]: семантика switch/case
От: DarkEld3r  
Дата: 18.12.15 11:48
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Ну, тут дело привычки скорее.

Да, но "явное лучше неявного".

S>Вот да, строк в ц++ не хватает. Но с другой стороны сравнение строк — достаточно дорогая операция и я стараюсь вообще их не сравнивать без необходимости.

Дык, "без необходимости" лучше вообще ничего не делать. Опять же, если строки в switch понадобятся, то никуда не денешься — придётся разные костыли городить. Которые производительнее вряд ли будут.
Да и дороговизна операции неожиданной окажется разве что для новичка, который сильно вряд ли пишет что-то очень требовательное к ресурсам. Ну а если пишет, то профайлер ему всё равно осилить придётся.

S>Опять же, сила привычки. Я привык так, другие этак...

Ну да. С этой точки зрения наиболее удобно решение с обязательными и break и fallthrough. Места для случайной ошибки не остаётся даже учитывая привычки из других языков. Всё-таки, при прочих равных, вероятность ошибки стоит минимизировать. Тем более, что потери функциональности тут нет.
Но оно и более многословно.
Re[14]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 11:51
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Да нет, это не демагогия...



S>Не спасало, не спасает и не будет спасать. При любом раскладе

S>Я не высказывал такой уверенности
Ну надо же. Так значит, защита от случайностей таки нужна?

S>Я так не считаю. У топикстартера такая ситуация


Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора, и болшинство тех, кто случайно забывает поставить бряк, тоже в курсе? Тогда причём тут твоё "учить язык"?!
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[15]: семантика switch/case
От: Sheridan Россия  
Дата: 18.12.15 12:18
Оценка:
Здравствуйте, T4r4sB, Вы писали:

S>>Не спасало, не спасает и не будет спасать. При любом раскладе

S>>Я не высказывал такой уверенности
TB>Ну надо же. Так значит, защита от случайностей таки нужна?
S>>Я так не считаю. У топикстартера такая ситуация
TB>Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора, и болшинство тех, кто случайно забывает поставить бряк, тоже в курсе?
На все случайности защит не оберешся. А если начать плодить защиты, то они могут начать срабатывать на правильный код. Со временем надоест читать варнинг и его отключат. А потом опять нарвутся на случайность и уже без варнинга.
Тут уже от кармы зависит.

TB>Тогда причём тут твоё "учить язык"?!

Топикстартер явно не знал
Автор: _hum_
Дата: 18.12.15
как работает switch
Matrix has you...
Re[16]: семантика switch/case
От: T4r4sB Россия  
Дата: 18.12.15 12:26
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>На все случайности защит не оберешся. А если начать плодить защиты, то они могут начать срабатывать на правильный код. Со временем надоест читать варнинг и его отключат. А потом опять нарвутся на случайность и уже без варнинга.

S>Тут уже от кармы зависит.

А что, вот есть же языки, в которых на каждый чих надо доказывать, что ты имел в виду именно то, что написал. На них наверное тоже больно писать и нужна золотая середина по части паранойи, ну так вот у сишки всё плохо с граблеопасностью, причём зачастую совершенно необоснованной.
Варнинги — они все срабатывают на правильный код, по определению.

S>Топикстартер явно не знал
Автор: _hum_
Дата: 18.12.15
как работает switch


>>Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[3]: JFYI: computed goto
От: watchmaker  
Дата: 18.12.15 12:31
Оценка:
Здравствуйте, _hum_, Вы писали:

__>это штука в с++ дает возможность реализовать механизм перехода по динамически определяемой метке, чего другими средствами добиться невозможно (только если использовать ассемблерные вставки).

Просто для информации: есть ещё и третий способ, в некотором смысле лежащий между этими двумя, — computed goto. Да, как и ассемблерные вставки, это нестандартный способ, но он поддерживается как минимум в gcc, clang, icc.
Преимущество в том, что эта штука работает быстрее чем switch, и при этом всё же лучше переносима по сравнению с ассемблером.
Поэтому во всяких интерпретаторах байт-кода и виртуальных машинах, где производительность стоит не на самом последнем месте, можно нередко встретить эти конструкции. Скажем, популярнейший CPython как пример можно сразу привести.
Re[2]: семантика switch/case
От: _hum_ Беларусь  
Дата: 18.12.15 13:07
Оценка:
Здравствуйте, Pzz, Вы писали:

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



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


Pzz>Оно бывает нужно, повесить одно и то же действие на несколько case, или по какому-то case сделать что-нибудь полезное, и провалиться в следующий case.


для этого можно было бы использовать обычный goto
Re[4]: JFYI: computed goto
От: _hum_ Беларусь  
Дата: 18.12.15 13:09
Оценка:
Здравствуйте, watchmaker, Вы писали:

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


__>>это штука в с++ дает возможность реализовать механизм перехода по динамически определяемой метке, чего другими средствами добиться невозможно (только если использовать ассемблерные вставки).

W>Просто для информации: есть ещё и третий способ, в некотором смысле лежащий между этими двумя, — computed goto. Да, как и ассемблерные вставки, это нестандартный способ, но он поддерживается как минимум в gcc, clang, icc.
W>Преимущество в том, что эта штука работает быстрее чем switch, и при этом всё же лучше переносима по сравнению с ассемблером.
W>Поэтому во всяких интерпретаторах байт-кода и виртуальных машинах, где производительность стоит не на самом последнем месте, можно нередко встретить эти конструкции. Скажем, популярнейший CPython как пример можно сразу привести.

и gcc тоже? а как же новый стандарт с его && для move-семантики?
Re[6]: JFYI: computed goto
От: _hum_ Беларусь  
Дата: 18.12.15 14:48
Оценка:
Здравствуйте, watchmaker, Вы писали:

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


__>>и gcc тоже?

W>Что значит «gcc тоже»? Выше ссылка и так ведёт на документацию gcc с описанием этой фичи. Конечно, в gcc это работает. Вроде, даже они первые и реализовали эту возможность для C/C++, а уж потом такой синтаксис расползся по остальным компиляторам.

__>>а как же новый стандарт с его && для move-семантики?

W>Какой новый стандарт? При чём тут move-семантика? Когда в коде встречаешь конструкцию
if (a && b) { ... }
тоже возникает мысль об move-семантике? Или всё же о том, что && означает в данном контексте логическое-И? Аналогично и && в контексте меток имеет смысл унарного оператора взятия адреса.

W>А вообще, эта возможность присутствует во многих языках, это не изобретение gcc: и в древнем фортране, и в бейсике, и в PL/I аналоги есть.

логический && — бинарный, а взятие адреса метки && — унарный, потому и легче напороться на неоднозначность. но если вы говорите, что все ок, то ок. приму к сведению. спасибо.
Re[9]: семантика switch/case
От: B0FEE664  
Дата: 18.12.15 14:52
Оценка:
Здравствуйте, _hum_, Вы писали:

__>... то вам и в голову не может прийти, что за простым switch/case могут скрываться какие-то системные вещи типа goto-переходов по меткам.


Слушайте и не говорите, что вас никто не предупреждал: в С++ почти все вещи не то, чем они кажутся.

Например, то равенство, которое упоминается ниже: a[b]==b[a] может как быть истинным, так и нет.
Или, например, вот такая конструкция:
A(b, с) = f();
может являться присваиванием переменным b и c результата f()

И вообще, есть множество вещей, которые просто невозможны в других языках. Например, можно передать в функцию параметром объект до того, как он был создан.
И каждый день — без права на ошибку...
Re[7]: JFYI: computed goto
От: watchmaker  
Дата: 18.12.15 15:11
Оценка:
Здравствуйте, _hum_, Вы писали:

__>логический && — бинарный, а взятие адреса метки && — унарный, потому и легче напороться на неоднозначность.


К слову, оператор - в выражении (-a) унарный, а в выражении u-v — бинарный. Или например, оператор * в выражении *nullptr унарный, а в выражении 3*5 — бинарный. Ничего нового :)
Re[8]: JFYI: computed goto
От: _hum_ Беларусь  
Дата: 18.12.15 16:17
Оценка:
Здравствуйте, watchmaker, Вы писали:

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


__>>логический && — бинарный, а взятие адреса метки && — унарный, потому и легче напороться на неоднозначность.


W>К слову, оператор - в выражении (-a) унарный, а в выражении u-v — бинарный. Или например, оператор * в выражении *nullptr унарный, а в выражении 3*5 — бинарный. Ничего нового

я про то, что унарные операторы легче могут приводить к неоднозначности (и необходимости вводить какие-то спец. средства), ибо "защищены операндами" только с одной стороны ну, например, (--x) — это (-(-x)) или (--(x)) — приходится отдельно оговаривать.
Re[3]: семантика switch/case
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.15 17:53
Оценка:
Здравствуйте, _hum_, Вы писали:

Pzz>>Оно бывает нужно, повесить одно и то же действие на несколько case, или по какому-то case сделать что-нибудь полезное, и провалиться в следующий case.


__>для этого можно было бы использовать обычный goto


Обычный goto в обычном Си не умеет гоутить по таблице.
Re[7]: семантика switch/case
От: Privalov  
Дата: 22.12.15 10:48
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>На самом деле руки чешутся чтото вот такое пописать, но задач таких нет. А чешется не так сильно, чтобы придумывать себе задачу и закупаться оборудованием


Напиши "черный список" для Nokia 3710, а то у меня руки не доходят. Там памяти, правда, чуть побольше, чем в микроконтроллере.
Re[8]: семантика switch/case
От: Sheridan Россия  
Дата: 22.12.15 11:15
Оценка:
Здравствуйте, Privalov, Вы писали:


P>Напиши "черный список" для Nokia 3710, а то у меня руки не доходят. Там памяти, правда, чуть побольше, чем в микроконтроллере.

Не, для антиквариата неохота писать...
Matrix has you...
Re[9]: семантика switch/case
От: Privalov  
Дата: 22.12.15 12:25
Оценка:
Здравствуйте, Sheridan, Вы писали:

P>>Напиши "черный список" для Nokia 3710, а то у меня руки не доходят.

S>Не, для антиквариата неохота писать...


Так и скажи: лень. Я пойму.
У меня этот антиквариат отлично работает. Ему бы черный список, и больше ничего не надо.
Re[5]: семантика switch/case
От: Дрободан Фрилич СССР  
Дата: 22.12.15 13:07
Оценка:
_hum_:

__>так поэтому я и обратил на эту штуку внимание только сейчас, после долгих лет знакомства,

Не верится чего-то в долгия лета знакомства с сями...
Re[10]: семантика switch/case
От: Sheridan Россия  
Дата: 22.12.15 14:26
Оценка:
Здравствуйте, Privalov, Вы писали:


P>Так и скажи: лень. Я пойму.

Да, лень

P>У меня этот антиквариат отлично работает. Ему бы черный список, и больше ничего не надо.

Жена пару лет назад ездила в тайланд с семьёй сестры, ей было задание — привезти самый дешевый новый телефон, который сможет найти. Купила чтото рублей за триста, лежит щас упакованный пылится на всякий случай
Matrix has you...
Re: семантика switch/case
От: maxluzin Европа  
Дата: 30.12.15 07:38
Оценка:
Здравствуйте, _hum_, Вы писали:

__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:

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

В известной книжке отцов-основателей языка "С" Кернигана и Ритчи в главе 3.4 приводится такой пример:
#include <stdio.h>
main() /* подсчет цифр, символов-разделителей и прочих символов */
{
    int c, i, nwhite, nother, ndigit[10];
    nwhite = nother = 0;
    for (i = 0; i < 10; i++)
        ndigit[i] = 0;
    while ((с = getchar()) != EOF) {
        switch (c) {
        case '0' : case '1' : case '2' : case '3' : case '4' :
        case '5' : case '6' : case '7' : case '8' : case '9' :
            ndigit[c - '0']++;
            break;
        case ' ':
        case '\n':
        case '\t':
            nwhite++;
            break;
        default:
            nother++;
            break;
        }
    }
    printf ("цифр =");
    for (i = 0; i < 10; i++)
        printf (" %d", ndigit[i]);
    printf(", символов-разделителей = %d, прочих = %d\n",
            nwhite, nother);
    return 0;
}

...как альтернатива той же самой программы, но с использованием if...then в первой главе:

#include <stdio.h>

/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
    int с, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10, ++i)
        ndigit[i]= 0;
    while ((c = getchar()) != EOF)
        if (c >='0' && с <= '9')
            ++ndigit[c – '0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite;
        else 
            ++nother;

    printf(“цифры =“);
    for (i = 0; i < 10; ++i)
        printf(“%d”, ndigit[i]);
    printf(“, символы-разделители =%d, прочие =%d\n”, nwhite, nother);
}


Там же они сами и дают комментарий на этот счёт:

"Сквозное" выполнение ветвей case вызывает смешанные чувства. С одной стороны, это хорошо, поскольку позволяет несколько ветвей case объединить в одну, как мы и поступили с цифрами в нашем примере. Но с другой — это означает, что в конце почти каждой ветви придется ставить break, чтобы избежать перехода к следующей. Последовательный проход по ветвям — вещь ненадежная, это чревато ошибками, особенно при изменении программы. За исключением случая с несколькими метками для одного вычисления, старайтесь по возможности реже пользоваться сквозным проходом, но если уж вы его применяете, обязательно комментируйте эти особые места.

Добрый вам совет: даже в конце последней ветви (после default в нашем примере) помещайте инструкцию break, хотя с точки зрения логики в ней нет никакой необходимости. Но эта маленькая предосторожность спасет вас, когда однажды вам потребуется добавить в конец еще одну ветвь case.


Где-то в другом месте в интервью (которое я уже не найду) они сказали про switch...case, что так было проще и естественнее реализовывать компилятор с "С" на скудных ресурсах PDP-11 (кажется), т.к. компилятор с "С" является однопроходным и это тогда выставлялось его огромным преимуществом, т.к. программы компилировались значительно быстрее, чем на двух-проходных... Отмазка, короче...
Отредактировано 30.12.2015 8:00 maxluzin . Предыдущая версия .
Re[13]: семантика switch/case
От: maxluzin Европа  
Дата: 30.12.15 10:27
Оценка:
Здравствуйте, _hum_, Вы писали:

//...

__>речь шла о человечности семантики для случая без break


О какой "человеческой семантике" можно говорить, когда язык создавался как можно ближе к ассемблеру по функциональности и быстродействию откомпиллированных программ?
Re[3]: семантика switch/case
От: maxluzin Европа  
Дата: 30.12.15 10:31
Оценка:
Здравствуйте, AlexRK, Вы писали:

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


M>>В известной книжке отцов-основателей языка "С" Кернигана и Ритчи в главе 3.4 приводится такой пример:


ARK>Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):


ARK>
ARK>        case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
ARK>


Кстати, потому что это выражение по семантике "С" будет равно '9', как результат выражений через запятую... Может поэтому?
Re[4]: семантика switch/case
От: watchmaker  
Дата: 30.12.15 11:45
Оценка:
Здравствуйте, maxluzin, Вы писали:

ARK>>
ARK>>        case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
ARK>>


M>Кстати, потому что это выражение по семантике "С" будет равно '9', как результат выражений через запятую... Может поэтому?


Повторюсь: нет, не поэтому
Автор: watchmaker
Дата: 16.12.15
. В языках C и C++ запятая в этом контексте не является оператором — об этом достаточно явно сказано в грамматике.
Так что если в новом стандарте будет введено правило, позволяющее трактовать такую конструкцию как множественный выбор, то это не сломает совместимости с предыдущими версиями или со старым кодом. Кстати говоря, в gcc и clang для таких случаев уже давным-давно есть расширение case ranges, правда оставшиеся только расширениями. Судя по всему, все неоднократные попытки изменить switch (убрать неявный fallthrough и/или добавить множественный выбор) в комитете так и не получили полной поддержки.
Re[4]: семантика switch/case
От: AlexRK  
Дата: 30.12.15 12:11
Оценка:
Здравствуйте, maxluzin, Вы писали:

M>Кстати, потому что это выражение по семантике "С" будет равно '9', как результат выражений через запятую... Может поэтому?


Ну другой оператор можно вместо запятой.
Re[3]: семантика switch/case
От: ononim  
Дата: 30.12.15 15:29
Оценка:
ARK>Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):
Потому что вот этот вот код будет более громоздко выглядеть
Автор: ononim
Дата: 17.12.15

Поймите, break — это абстракция более высокого уровня нежели возможность перечисления case'ов подряд, которая сама по себе является лишь маленьким частным случаем возможности пихать брейк в switch'е куда угодно и сколько угодно раз.
Как много веселых ребят, и все делают велосипед...
Re[4]: семантика switch/case
От: AlexRK  
Дата: 30.12.15 19:14
Оценка:
Здравствуйте, ononim, Вы писали:

ARK>>Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):

O>Потому что вот этот вот код будет более громоздко выглядеть
Автор: ononim
Дата: 17.12.15


Этот код плох и провоцирует ошибки при модификации, его необходимо переписать на функциях.

O>Поймите, break — это абстракция более высокого уровня


Да, я действительно не понимаю, почему goto, добавленный в оператор выбора, делает его абстракцией более высокого уровня. Ну и потребности в такой абстракции (если ее можно так назвать) я пока не вижу. Примеры типа приведенного выше иллюстрируют, по моему скромному мнению, скорее вред этой "высокоуровневой абстракции".
Re[5]: семантика switch/case
От: ononim  
Дата: 30.12.15 19:34
Оценка:
ARK>>>Вот не понимаю, почему нельзя было сделать так, без этих break-костылей (разумеется, это не валидная программа на C):
O>>Потому что вот этот вот код будет более громоздко выглядеть
Автор: ononim
Дата: 17.12.15

ARK>Этот код плох и провоцирует ошибки при модификации, его необходимо переписать на функциях.
Это при модификации теми, кто привык к pascal-style switch'у. Ну так привыкли — и оставайтесь на нем, незачем ходить гулять в С-лес, ведь известно что там обезъяны, кашалоты ииии зеленый попугай

O>>Поймите, break — это абстракция более высокого уровня

ARK> Да, я действительно не понимаю, почему goto, добавленный в оператор выбора, делает его абстракцией более высокого уровня. Ну и потребности в такой абстракции (если ее можно так назвать) я пока не вижу. Примеры типа приведенного выше иллюстрируют, по моему скромному мнению, скорее вред этой "высокоуровневой абстракции".
Потому что goto, работающий сключительно сверху вниз не так уж и плох. Вот если бы можно было сделать так (надо сказать я в свое время был удивлен и немного подавлен от того что так делать нельзя, ну да ладно, идеальной симметрии в этом мире не найти):
switch (v)
{
case 1:
foo1();
break;

case 2:
foo2();
break;

case 3:
foo3();
goto case 1: //hehehe
}

Вот тогда это был бы "плохой" goto. А учитывая навязанный порядок исполнения сверху вниз — эти goto ничуть не хуже чем goto реализованные скажем обычным вашим "высокоурвневым" (без-break-ововым) switch'ем, код в кейсах которого склонен кидаться исключениями (чуть менее чем любой продакшен код). Ну так брейки хоть видно то сразу..
Как много веселых ребят, и все делают велосипед...
Отредактировано 30.12.2015 19:36 ononim . Предыдущая версия .
Re[7]: семантика switch/case
От: ononim  
Дата: 30.12.15 20:19
Оценка:
O>>Потому что goto, работающий сключительно сверху вниз не так уж и плох. Вот если бы можно было сделать так (надо сказать я в свое время был удивлен и немного подавлен от того что так делать нельзя, ну да ладно, идеальной симметрии в этом мире не найти):
ARK>Кстати да, это мне тоже непонятно. Какой смысл защищать ущербный гото (полноценный еще ладно бы). Вот вы реализуете алгоритм на проваливаниях в свитче, а что будете делать, если при модификации существующего кода в одном месте возникнет потребность скакнуть слегка не туда, куда дозволено? (К примеру, с OVERWRITE надо будет сразу идти в POSTPONE.) Вся прекрасная высокоуровневоабстрактная картина развалится и переходим к старым добрым паскалевым кейсам и функциям?
Да, нет в жизни счастья. Паскаль-стайл свич — это набор кирпичиков, сишный — это кусок глины. Глины, а не кваркового супа, которым является асм Кому что нравится — тот там и пасется.
Как много веселых ребят, и все делают велосипед...
Re[7]: семантика switch/case
От: enji  
Дата: 08.01.16 08:24
Оценка:
Здравствуйте, Sheridan, Вы писали:


S>На самом деле руки чешутся чтото вот такое пописать, но задач таких нет. А чешется не так сильно, чтобы придумывать себе задачу и закупаться оборудованием


купи ардуинку, там 32к ПЗУ и 2 по моему ОЗУ Цена вопроса на алиэкспресс ~400 р
Re[8]: семантика switch/case
От: Sheridan Россия  
Дата: 08.01.16 09:21
Оценка:
Здравствуйте, enji, Вы писали:

S>>На самом деле руки чешутся чтото вот такое пописать, но задач таких нет. А чешется не так сильно, чтобы придумывать себе задачу и закупаться оборудованием

E>купи ардуинку, там 32к ПЗУ и 2 по моему ОЗУ Цена вопроса на алиэкспресс ~400 р
А обвязка? Ну, БП, интерфейсы. К компу надо ж подключить....
Matrix has you...
Re[10]: семантика switch/case
От: Vain Россия google.ru
Дата: 08.01.16 12:09
Оценка:
Здравствуйте, ononim, Вы писали:

__>>безусловно, но использовать более одного return — это моветон

O>Это многое объясняет Впрочем возможно для С это действительно не комильфо, но тут... та-да! на сцену на белом ишаке выезжает С++ с RAII наперевес
забыл, что ишак теперь тоже белый конь с сообщениями вида "not reachable code" (after return).
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[10]: семантика switch/case
От: Sheridan Россия  
Дата: 10.01.16 14:30
Оценка:
Здравствуйте, enji, Вы писали:

S>>А обвязка? Ну, БП, интерфейсы. К компу надо ж подключить....

E>там встроенный адаптер usb-usart, оттуда же оно и питается. Можно подключить к компу usb-шнурком и заливать проги / общаться по com-порту
E>Можно отдельный БП сделать из какой-нить телефонной зарядки. Плат расширений много на любой вкус — реле, ethernet, радио, движки.

Ну дай пожалуйста линк на алиэкспресс какой нибудь на базовый набор.
Matrix has you...
Re[6]: семантика switch/case
От: T4r4sB Россия  
Дата: 10.01.16 14:33
Оценка:
Здравствуйте, maxluzin, Вы писали:

M>Ну хорошо, а как вы будете бороться с такой ситуацией?:

  Скрытый текст
M>
M>/** nonsence.h **/

M>#if defined(_ONE_)

M>#    define CONST_A  (1)
M>// ...
M>#    define CONST_B  (2)
M>#    define CONST_C  (3)
M>// ...
M>#    define CONST_D  (1)   /* Hello ! */

M>#else

M>#    define CONST_A  (1)
M>// ...
M>#    define CONST_B  (2)
M>#    define CONST_C  (3)
M>// ...
M>#    define CONST_D  (4)   /* OK */

M>#endif

M>


M>
M>#include "nonsence.h"

M>int main()
M>{
M>    //...
M>    switch (X)
M>    {
M>        case (CONST_A, CONST_B):    // 1 or 2
M>            foo();
M>            break;
M>        case (CONST_C, CONST_D):    // 3 or 1
M>            bar();
M>            break;
M>        case ((CONST_A & CONST_B) | (CONST_C & CONST_D) ):
M>            blah_blah();
M>            break;
M>        default:
M>            //...
M>    }
M>    // ...
M>    return (0);
M>}

M>


M>И чё делать компилятору, когда возникает такая неоднозначность? Просто обругать и выкинуть ошибку? А если так задумано, что CONST_x могут принимать различные значения? И не добавит ли нам ещё больше головной боли такая "вольность", чем простая "switch-board" по одному константному значению?


Не вижу никакой неоднозначности, в метках кейса стоят не перечисления, а арифметические выражения, вычислимые при компиляции. Где проблема?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[12]: семантика switch/case
От: Sheridan Россия  
Дата: 10.01.16 19:31
Оценка:
Здравствуйте, enji, Вы писали:

E>Ну и просто в поиске там вбей arduino и поставь бесплатную доставку — тонны всякого разного


Заказал кит, пару дисплеев и пару датчиков для начала. Посмотрю шокак. Спасибо
Matrix has you...
Re[2]: семантика switch/case
От: MasterZiv СССР  
Дата: 11.01.16 11:24
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Потому что не тем местом думали, когда язык делали.


Вообще-то чтение элементарного букваря по С (даже не по С++) уже спасает от указанных выше неожиданностей.
А про "не тем местом" -- кто ж тебя останавливает, давай, выдумай свой язык, "T" например, если он будет
сильно лучше всех остальных, так мы же будем рады просто на нём программировать!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.