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>А ты, оказывается, любитель пограничных аналогий и сравнений


Я просто не знаю, как ещё объяснить.
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>Я так не считаю. У топикстартера такая ситуация


Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора, и болшинство тех, кто случайно забывает поставить бряк, тоже в курсе? Тогда причём тут твоё "учить язык"?!
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


>>Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора?
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[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[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[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[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, а то у меня руки не доходят. Там памяти, правда, чуть побольше, чем в микроконтроллере.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.