Здравствуйте, _hum_, Вы писали:
VF>>Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch __>ну я же не знал. почему вы полагаете, что мой случай уникален?
Вот не обижайся пожалуйста, но просто это как бы базовые знания. Возможно просто мимо тебя оно проскочило: на лекцию из за болезни не сходил или ктото из страуструпа пару листов гуашью залил...
Здравствуйте, Sheridan, Вы писали:
S>Здравствуйте, _hum_, Вы писали:
VF>>>Спасибо, конечно. Но "другие граждане" на этом форуме уже знают как работает switch __>>ну я же не знал. почему вы полагаете, что мой случай уникален? S>Вот не обижайся пожалуйста, но просто это как бы базовые знания. Возможно просто мимо тебя оно проскочило: на лекцию из за болезни не сходил или ктото из страуструпа пару листов гуашью залил...
я же объяснил выше, почему оно прошло мимо меня (и, думаю, не только меня) — если вы не системный программист, и сипользуете с/c++ как язык высокого уровня, то вам и в голову не может прийти, что за простым switch/case могут скрываться какие-то системные вещи типа goto-переходов по меткам.
а в учебниках к нему отношение не как к goto ("внимание!" "осторожно!" "нарушение структурного программирования!" "чревато!", "лучше не использовать без крайне йнеобходимости" и т.п.), а как к обычному if — типичные примерчики с break-ами.
а сам человек догадаться до того, что там что-то приницпиально отличное от if не может из-за дурацкого названия.
Здравствуйте, Sheridan, Вы писали:
S>То есть ты хочешь сказать, что отсутствие бряка в свиче — ошибка??? о0 S>Это не ошибка. На самом деле и пресловутая if(val=15) {} не ошибка. ВНЕЗАПНО, да? Работать начинает по другому, да. Но не ошибка.
По-моему, ты ударился в демагогию.
S>Грабель не надо бояться — это ценный опыт. Главное — запоминать их расположение. И изучать карты, составленные другими
Знание об их расположении не спасает от случайностей.
S>Я встречал, правда начинающих. S>А насчет использования чегототам... Работает? Да. Значит пусть. А то, что остальных считают быдлом — так это их проблемы. Они то среди быдла живут
Угу, вот такая же уверенность в том, что он никогда не ошибается.
S>Я вообще админ.
То есть программы пишешь лишь утилитки на тыщу строк?
S>Ты верно подметил, это две разных способности. И первая очень и очень помогает в реализации второй.
Тогда почему ты всерьёз считаешь, что люди не ставят бряк потому, что не в курсе насчёт протеканий?
S>А ты, оказывается, любитель пограничных аналогий и сравнений
Здравствуйте, _hum_, Вы писали:
__>Всегда полагал, что семантика switch/case/case/... аналогична if/if/if/... без break-а и if/else if/else if/... c break-ом. А тут решил не ставить break "в конце ветки выбора", и опля — сюрприз. Так что, товарищи, кто еще так же, как и я, заблуждался, будьте внимательны:
А на самом деле, switch/case работает, как goto по таблице. Сюрприз, да?
__>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?
Оно бывает нужно, повесить одно и то же действие на несколько case, или по какому-то case сделать что-нибудь полезное, и провалиться в следующий case.
S>>То есть ты хочешь сказать, что отсутствие бряка в свиче — ошибка??? о0 S>>Это не ошибка. На самом деле и пресловутая if(val=15) {} не ошибка. ВНЕЗАПНО, да? Работать начинает по другому, да. Но не ошибка. TB>По-моему, ты ударился в демагогию.
Да нет, это не демагогия...
S>>Грабель не надо бояться — это ценный опыт. Главное — запоминать их расположение. И изучать карты, составленные другими TB>Знание об их расположении не спасает от случайностей.
Не спасало, не спасает и не будет спасать. При любом раскладе
S>>Я встречал, правда начинающих. S>>А насчет использования чегототам... Работает? Да. Значит пусть. А то, что остальных считают быдлом — так это их проблемы. Они то среди быдла живут TB>Угу, вот такая же уверенность в том, что он никогда не ошибается.
Я не высказывал такой уверенности
S>>Я вообще админ. TB>То есть программы пишешь лишь утилитки на тыщу строк? Не совсем.
S>>Ты верно подметил, это две разных способности. И первая очень и очень помогает в реализации второй. TB>Тогда почему ты всерьёз считаешь, что люди не ставят бряк потому, что не в курсе насчёт протеканий?
Я так не считаю. У топикстартера такая ситуация
S>>А ты, оказывается, любитель пограничных аналогий и сравнений TB>Я просто не знаю, как ещё объяснить.
Да я не против
Здравствуйте, Sheridan, Вы писали:
S>Ну, тут дело привычки скорее.
Да, но "явное лучше неявного".
S>Вот да, строк в ц++ не хватает. Но с другой стороны сравнение строк — достаточно дорогая операция и я стараюсь вообще их не сравнивать без необходимости.
Дык, "без необходимости" лучше вообще ничего не делать. Опять же, если строки в switch понадобятся, то никуда не денешься — придётся разные костыли городить. Которые производительнее вряд ли будут.
Да и дороговизна операции неожиданной окажется разве что для новичка, который сильно вряд ли пишет что-то очень требовательное к ресурсам. Ну а если пишет, то профайлер ему всё равно осилить придётся.
S>Опять же, сила привычки. Я привык так, другие этак...
Ну да. С этой точки зрения наиболее удобно решение с обязательными и break и fallthrough. Места для случайной ошибки не остаётся даже учитывая привычки из других языков. Всё-таки, при прочих равных, вероятность ошибки стоит минимизировать. Тем более, что потери функциональности тут нет.
Но оно и более многословно.
Здравствуйте, Sheridan, Вы писали:
S>Да нет, это не демагогия...
S>Не спасало, не спасает и не будет спасать. При любом раскладе S>Я не высказывал такой уверенности
Ну надо же. Так значит, защита от случайностей таки нужна?
S>Я так не считаю. У топикстартера такая ситуация
Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора, и болшинство тех, кто случайно забывает поставить бряк, тоже в курсе? Тогда причём тут твоё "учить язык"?!
Здравствуйте, T4r4sB, Вы писали:
S>>Не спасало, не спасает и не будет спасать. При любом раскладе S>>Я не высказывал такой уверенности TB>Ну надо же. Так значит, защита от случайностей таки нужна? S>>Я так не считаю. У топикстартера такая ситуация TB>Ты понимаешь, что это нетипичный случай и что большинство в курсе про идиотскую семантику этого оператора, и болшинство тех, кто случайно забывает поставить бряк, тоже в курсе?
На все случайности защит не оберешся. А если начать плодить защиты, то они могут начать срабатывать на правильный код. Со временем надоест читать варнинг и его отключат. А потом опять нарвутся на случайность и уже без варнинга.
Тут уже от кармы зависит.
TB>Тогда причём тут твоё "учить язык"?!
Топикстартер явно не знал
Здравствуйте, Sheridan, Вы писали:
S>На все случайности защит не оберешся. А если начать плодить защиты, то они могут начать срабатывать на правильный код. Со временем надоест читать варнинг и его отключат. А потом опять нарвутся на случайность и уже без варнинга. S>Тут уже от кармы зависит.
А что, вот есть же языки, в которых на каждый чих надо доказывать, что ты имел в виду именно то, что написал. На них наверное тоже больно писать и нужна золотая середина по части паранойи, ну так вот у сишки всё плохо с граблеопасностью, причём зачастую совершенно необоснованной.
Варнинги — они все срабатывают на правильный код, по определению.
S>Топикстартер явно не знал
Здравствуйте, _hum_, Вы писали:
__>это штука в с++ дает возможность реализовать механизм перехода по динамически определяемой метке, чего другими средствами добиться невозможно (только если использовать ассемблерные вставки).
Просто для информации: есть ещё и третий способ, в некотором смысле лежащий между этими двумя, — computed goto. Да, как и ассемблерные вставки, это нестандартный способ, но он поддерживается как минимум в gcc, clang, icc.
Преимущество в том, что эта штука работает быстрее чем switch, и при этом всё же лучше переносима по сравнению с ассемблером.
Поэтому во всяких интерпретаторах байт-кода и виртуальных машинах, где производительность стоит не на самом последнем месте, можно нередко встретить эти конструкции. Скажем, популярнейший CPython как пример можно сразу привести.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, _hum_, Вы писали:
__>>p.s. Вопрос к знатокам — зачем такая неочевидная и "техническая" семантика?
Pzz>Оно бывает нужно, повесить одно и то же действие на несколько case, или по какому-то case сделать что-нибудь полезное, и провалиться в следующий case.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, _hum_, Вы писали:
__>>это штука в с++ дает возможность реализовать механизм перехода по динамически определяемой метке, чего другими средствами добиться невозможно (только если использовать ассемблерные вставки). W>Просто для информации: есть ещё и третий способ, в некотором смысле лежащий между этими двумя, — computed goto. Да, как и ассемблерные вставки, это нестандартный способ, но он поддерживается как минимум в gcc, clang, icc. W>Преимущество в том, что эта штука работает быстрее чем switch, и при этом всё же лучше переносима по сравнению с ассемблером. W>Поэтому во всяких интерпретаторах байт-кода и виртуальных машинах, где производительность стоит не на самом последнем месте, можно нередко встретить эти конструкции. Скажем, популярнейший CPython как пример можно сразу привести.
и gcc тоже? а как же новый стандарт с его && для move-семантики?
Здравствуйте, _hum_, Вы писали:
__>и gcc тоже?
Что значит «gcc тоже»? Выше ссылка и так ведёт на документацию gcc с описанием этой фичи. Конечно, в gcc это работает. Вроде, даже они первые и реализовали эту возможность для C/C++, а уж потом такой синтаксис расползся по остальным компиляторам.
__>а как же новый стандарт с его && для move-семантики?
Какой новый стандарт? При чём тут move-семантика? Когда в коде встречаешь конструкцию
if (a && b) { ... }
тоже возникает мысль об move-семантике? Или всё же о том, что && означает в данном контексте логическое-И? Аналогично и && в контексте меток имеет смысл унарного оператора взятия адреса.
А вообще, эта возможность присутствует во многих языках, это не изобретение gcc: и в древнем фортране, и в бейсике, и в PL/I аналоги есть.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, _hum_, Вы писали:
__>>и gcc тоже? W>Что значит «gcc тоже»? Выше ссылка и так ведёт на документацию gcc с описанием этой фичи. Конечно, в gcc это работает. Вроде, даже они первые и реализовали эту возможность для C/C++, а уж потом такой синтаксис расползся по остальным компиляторам.
__>>а как же новый стандарт с его && для move-семантики? W>Какой новый стандарт? При чём тут move-семантика? Когда в коде встречаешь конструкцию
if (a && b) { ... }
тоже возникает мысль об move-семантике? Или всё же о том, что && означает в данном контексте логическое-И? Аналогично и && в контексте меток имеет смысл унарного оператора взятия адреса. W>А вообще, эта возможность присутствует во многих языках, это не изобретение gcc: и в древнем фортране, и в бейсике, и в PL/I аналоги есть.
логический && — бинарный, а взятие адреса метки && — унарный, потому и легче напороться на неоднозначность. но если вы говорите, что все ок, то ок. приму к сведению. спасибо.
Здравствуйте, _hum_, Вы писали:
__>... то вам и в голову не может прийти, что за простым switch/case могут скрываться какие-то системные вещи типа goto-переходов по меткам.
Слушайте и не говорите, что вас никто не предупреждал: в С++ почти все вещи не то, чем они кажутся.
Например, то равенство, которое упоминается ниже: a[b]==b[a] может как быть истинным, так и нет.
Или, например, вот такая конструкция:
A(b, с) = f();
может являться присваиванием переменным b и c результата f()
И вообще, есть множество вещей, которые просто невозможны в других языках. Например, можно передать в функцию параметром объект до того, как он был создан.
Здравствуйте, _hum_, Вы писали:
__>логический && — бинарный, а взятие адреса метки && — унарный, потому и легче напороться на неоднозначность.
К слову, оператор - в выражении (-a) унарный, а в выражении u-v — бинарный. Или например, оператор * в выражении *nullptr унарный, а в выражении 3*5 — бинарный. Ничего нового :)
Здравствуйте, 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 (то есть, форма записи не столько приводит в замешательство — "как это понимать?!" (и отправляет к чтению док.), сколько вызывает эффект "очевидно же, что здесь будет выполняться сложение", и последующие мытарства по поиску ошибок).
я же говорю, что сам только теперь начал рыться в подробностях семантики свитча, потому как много-много лет для меня было "очевидно" по названию, структуре и примерам использования, какая у него семантика.
Здравствуйте, watchmaker, Вы писали:
W>Здравствуйте, _hum_, Вы писали:
__>>логический && — бинарный, а взятие адреса метки && — унарный, потому и легче напороться на неоднозначность.
W>К слову, оператор - в выражении (-a) унарный, а в выражении u-v — бинарный. Или например, оператор * в выражении *nullptr унарный, а в выражении 3*5 — бинарный. Ничего нового
я про то, что унарные операторы легче могут приводить к неоднозначности (и необходимости вводить какие-то спец. средства), ибо "защищены операндами" только с одной стороны ну, например, (--x) — это (-(-x)) или (--(x)) — приходится отдельно оговаривать.
Здравствуйте, _hum_, Вы писали:
Pzz>>Оно бывает нужно, повесить одно и то же действие на несколько case, или по какому-то case сделать что-нибудь полезное, и провалиться в следующий case.
__>для этого можно было бы использовать обычный goto
Обычный goto в обычном Си не умеет гоутить по таблице.
Здравствуйте, Sheridan, Вы писали:
S>На самом деле руки чешутся чтото вот такое пописать, но задач таких нет. А чешется не так сильно, чтобы придумывать себе задачу и закупаться оборудованием
Напиши "черный список" для Nokia 3710, а то у меня руки не доходят. Там памяти, правда, чуть побольше, чем в микроконтроллере.