|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Есть возможность проверить себя и без отладчика сообразить, что делает этот код? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Это же за гранью добра и зла. Впервые сегодня увидел такое. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 21:03 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
В С много такой гадости, С изобретали не в угоду читабельности, все было направлено на производительность, тогда это было актуально. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 21:10 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
petrav Это же за гранью добра и зла. Впервые сегодня увидел такое. Почему впервые? Duff's device много раз сюда постили. Это по сути оно же. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 22:14 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky petrav Это же за гранью добра и зла. Впервые сегодня увидел такое. Почему впервые? Duff's device много раз сюда постили. Это по сути оно же. Я только что впервые узнал о таком устройстве. Я вот тут думал, а как такую конструкцию вообще объяснить на словах? Она же абсурдна. И догадался. Я всегда воспринимал оператор switch как расширенный if / else с нюансом, что без break мы переходим в следующую ветку. А такое восприятие неверно. Операторы case / default нужно воспринимать как метки для оператора goto. А оператор switch — это условный оператор goto. И всё встаёт на свои места. Конструкция становится логичной и простой. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2020, 23:09 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :) (я не знала, что switch так работает) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 01:20 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
petrav, на спичках экономят! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 10:25 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
do ... while (false) - лишний. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 10:43 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
mini.weblab если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :) (я не знала, что switch так работает) В некоторых командах есть соглашение о том что пустые секции default или объединённые case - маркируются специальным поясняющим комментарием о том что дескыть так и надо и здесь нет ошибки разработчика. Потому-то со стороны да. Выглядит как будто просто завтык. А в данном исходнике я-бы просто отказался от switch в пользу if-else. Switch - это оператор варианта. А зачем нужен вариант без вариантов. Просто выглядит как воцафак и просто неряшливость. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 13:18 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
maytonВ некоторых командах есть соглашение о том что пустые секции default или объединённые case - маркируются специальным поясняющим комментарием о том что дескыть так и надо и здесь нет ошибки разработчика. Более того, современные версии GCC выдают предупреждение, если такового комментария или соотвествующего C++17 атрибута нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 13:24 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
И я думаю что утилиты статического анализа такие как Sonar/PVS здесь просто должны выбросить алерт. Может не critical, но тем не меннее какой-то важности чтоб обратить внимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 13:56 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
mayton Switch - это оператор варианта... Нет конечно , не совсем так. В том смысле, в каком под оператором варианта подразумевается структурированный оператор с единственной веткой выбора. if elsif else - можно было бы поназывать вариантом "оператора варианта" (если не использовать возможности "побочных действий", таких как в стартовом примере, ломающих его до неструктурированного), а switch - нет , без специальных услилий программиста, специально выписывающего switch в сограсованном со структурным программированием стиле . Если, например, цикл целиком состоит из единственного структурированного if elsif else, то он и глазами и компилятором, потенциально, может анализироваться на тему своей завершаемости, или иных соображений, обеспечивающих формальное доказательство правильности цикла. То есть, если в цикле есть набор охран, за каждой из которых своя команда выполнения, то "традиционный анализ" требует единственного срабатывания только одной из охран, даже если по состоянию цикла могло бы сработать несколько. Это существенно используется в формальных доказательствах правильности построения цикла. На цикле, внутри которого сишный switch, такой анализ в своей первоначальной постановке просто не работает, если существуют неразделенные break-ом охраняемые команды. (Правда, на if с побочным действием тоже далеко не разбежишься) В Си switch аналог неструктурированных фортрановых вычислимых или присвоенных goto и/или vba-шного On expression GOTO line, но со своим блекджеком в виде произвольного местоположения default. mayton А зачем нужен вариант без вариантов. В VBA можно сказать, что нигде не нужен, потому что, кроме неструктурированного On expression GOTO line, там есть структурированный Select case, которому прямо в ветке можно указать список значений или диапазон Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В Си ты должен выписать столько "пустых" case, сколько элементов в "списке выбора", приводящему к единственному действию. --- В стартовом примере заявленные случаи должны попасть внутрь ветки if с побочным действием, который находится внутри default секции. Это не сложно, потому что if целиком положен внутрь switch, но заштукатуренному структурным программированием мозгу надо приглядеться. А "устройство Даффа" выносит мозг наверно каждому, кто видит его первый раз, именно пересечением - там switch начат до начала цикла, а цикл закончен после завершения switch. Ну, это особенность синтаксиса. Ни на фортране, ни на бейсике такое устройство мозг не взорвет с их неструктурированными goto. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 15:53 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Мне нравился-бы вариант в котором в case-секциях стоит функция или предикат. И при этом работает охранная логика исполнения первого условия которое вышло в true. А не константа как в большинстве use-cases. Пример: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 17:24 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
mayton, чего-то похожего для expression можно добиваться вложениями условного оператора ? И выглядеть будет похоже: Код: plaintext 1. 2. 3.
для statement, вероятно считается - зачем заменять if, если и так работает... Хотя, есть для statement в "некоторых языках" соглашение о полноте вариантов выбора, то есть, либо должен быть выписан явный else, либо, когда его нет, и по текущему состоянию вычисления нет явной ветки для выбора, то система должна генерировать ошибку времени выполнения. Это, бывает, явно эксплуатируют... ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 18:09 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента? Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2020, 20:05 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
mayton booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента? Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch. Похоже, что в такой формулировке я не понимаю, с чем соглашаться, а с чем нет. "изменяемость" или "не изменяемость" "условий" не имеет самостоятельного значимого для switch контекста, после того как решение о переходе на конкретную метку уже принято. До морковкиного заговения можно обсуждать - важно или нет - изменилось ли состояние переменной, по значению которой мы оказались "здесь" , если мы уже здесь . И должно ли после принятия решения оно оказываться "здесь" проверяемо "тем же", что и "до принятия решения". Насчет "много ограничений" - не вижу этого - требуется значение, приводимое к целочисленному виду. Скажем так, как на самый первый взгляд, это даже свободнее вариантов, настаивающих на логическом значении в каждой ветке. Более того, я даже не знаю, ставится ли, и какое, формальное ограничение на число веток. Basic, как счастливо взял от фортрана 255 как максимум, так и живет с этим. Подозреваю, что для Си этот вопрос, почти традиционно, отдаётся на усмотрение реализации. Короче, для своего времени - зашибись конструкция. Но следования "канонам" структурного программирования никто не обещал. Пропессорские выдумки о том, как студенты должны писать программы, пожалуйста, в одну корзину, а мучения взрослых инженеров со положенными на них (или взятыми добровольно на себя) обязательствами о том, как и на чем им прямо сейчас на самом деле писать - придется складывать в другую. Прямо-таки почти навязывается встречный вопрос - должны ли мы немедленно вспомнить о господине Гослинге, например, озаботившемуся вопросом реорганизации рабкрина неправильного языка в правильный для каждого браузера, да более того - вообще для всего интернета. Или пришло-таки время вспомнить о ржвачине... Если серьёзно - не трожьте (в смысле не судите) Си лапками, замаранными структурным программированием. А вот как именно и почему точно о вопросе структурированного оператора выбора не заботится C++ - это малёк за рамками моей компетенции. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 00:42 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
На языке условного ассемблера алгоритм выглядит примерно так: Код: asm 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 10:40 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
rdb_devпримерно так Авотхрен. Если список вариантов плотный, то он выглядит как одна команда "jmp table[al]". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 12:13 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, финты ушами оптимизации не принципиальны. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 13:14 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
По поводу инженеришки Гослинга и его JVM байткодов (опкодов). Есть отдельная инструкция tableswitch (0xAA) . По сути представляет аргументами case-константы и jump-offsets куда надо прыгнуть. Вобщем-то и всё. Современные сборочные конструкции со строками в switch возможно уже собираются как-то по другому. На условных переходах. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 13:35 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Кей Хорстман на Joker сетует об отсутствии expression для multi-way branch. Якобы для if-else есть а для switch нету. Упоминает о дихотомическом поиске для switch jump table. И о sequental для patterns. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2020, 23:43 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
petrav Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Хрень какая-то! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2020, 05:28 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
SQL2008, где хрень?! Там всё отлично! ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2020, 10:36 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
Если принять во внимание пост Буби и также тот факт что Си считается портабельным ассемблером, то в нем (ассемблере) можно сделать ВСЁ! Тоесть располагать ключевые слова языка в любом порядке для достижения цели. Также как и __asm мнемоники вы можете располагать как угодно лишь-бы работало. И никто вас не покритикует. И мы имеем дело с архаизмом. И хотя мой консервативный мозг смотрит в сторону большей строгости и чеков в фазе компилляции я готов махнуть рукой на этот стиль и просто согласиться с тем что разработчики Bell Labs были первопроходцами и решали насущные проблемы разработки операционок и телефонного софта. Для них стиль стоял не на первом месте, хотя для нас сегодня, измученных нарзаном PSV-Studio и Сонаром такой подход кажется немыслимым кощунством. По сути смысл обсуждения должен быть таков. >> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2020, 11:20 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
mayton >> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2020, 12:21 |
|
Очень интересны нюанс с оператором switch
|
|||
---|---|---|---|
#18+
rdb_dev mayton >> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации Как часто такое бывает в практике современного С/C++ разработчика? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2020, 12:53 |
|
|
start [/forum/topic.php?fid=57&msg=39982198&tid=2017371]: |
0ms |
get settings: |
10ms |
get forum list: |
10ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 139ms |
0 / 0 |