powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Очень интересны нюанс с оператором switch
25 сообщений из 236, страница 1 из 10
Очень интересны нюанс с оператором switch
    #39981555
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть возможность проверить себя и без отладчика сообразить, что делает этот код?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
bool testSwitch()
{
    char ch = 'c'; // Или 'a', например.
    char str[] = "bcd";
    char *ptr = nullptr;
    int count = 0;

    switch (ch)
    {
    default:
        if ((ptr = strchr(str, ch)) == nullptr)
    case '\0':
    case 'e':
    case 'f':
    case 'g':
            return false;
        else
            count++;
        break;
    }

    return true;
}


Это же за гранью добра и зла. Впервые сегодня увидел такое.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981556
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С много такой гадости, С изобретали не в угоду читабельности, все было направлено на производительность, тогда это было актуально.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981567
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Это же за гранью добра и зла. Впервые сегодня увидел такое.

Почему впервые? Duff's device много раз сюда постили. Это по сути оно же.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981577
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
petrav
Это же за гранью добра и зла. Впервые сегодня увидел такое.

Почему впервые? Duff's device много раз сюда постили. Это по сути оно же.

Я только что впервые узнал о таком устройстве.

Я вот тут думал, а как такую конструкцию вообще объяснить на словах? Она же абсурдна. И догадался. Я всегда воспринимал оператор switch как расширенный if / else с нюансом, что без break мы переходим в следующую ветку. А такое восприятие неверно.

Операторы case / default нужно воспринимать как метки для оператора goto. А оператор switch — это условный оператор goto. И всё встаёт на свои места. Конструкция становится логичной и простой.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981599
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :)
(я не знала, что switch так работает)
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981677
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav, на спичках экономят!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
do
  switch (ch)
  {
  case '\0':
  case 'e':
  case 'f':
  case 'g':
    break;
  default:
    if (nullptr != (ptr = str, ch))
    {
      count++;
      return true;
    }
  }
while (false);
return false;
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981687
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
do ... while (false) - лишний.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981770
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :)
(я не знала, что switch так работает)

В некоторых командах есть соглашение о том что пустые секции default или объединённые case - маркируются
специальным поясняющим комментарием о том что дескыть так и надо и здесь нет ошибки разработчика.

Потому-то со стороны да. Выглядит как будто просто завтык.

А в данном исходнике я-бы просто отказался от switch в пользу if-else.

Switch - это оператор варианта. А зачем нужен вариант без вариантов. Просто выглядит как воцафак и просто неряшливость.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981775
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВ некоторых командах есть соглашение о том что пустые секции default или объединённые case
- маркируются специальным поясняющим комментарием о том что дескыть так и надо и здесь нет
ошибки разработчика.

Более того, современные версии GCC выдают предупреждение, если такового комментария или
соотвествующего C++17 атрибута нет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981798
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я думаю что утилиты статического анализа такие как Sonar/PVS здесь просто должны выбросить алерт.

Может не critical, но тем не меннее какой-то важности чтоб обратить внимание.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981876
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Dim Number 
Number = 8  

Select Case Number  
Case 1 To 5    
    Debug.Print "Between 1 and 5" 
Case 6, 7, 8   
    Debug.Print "Between 6 and 8" 
Case Else    
    Debug.Print "Not between 1 and 8" 
End Select


В Си ты должен выписать столько "пустых" case, сколько элементов в "списке выбора", приводящему к единственному действию.
---
В стартовом примере заявленные случаи должны попасть внутрь ветки if с побочным действием, который находится внутри default секции.
Это не сложно, потому что if целиком положен внутрь switch, но заштукатуренному структурным программированием мозгу надо приглядеться.

А "устройство Даффа" выносит мозг наверно каждому, кто видит его первый раз, именно пересечением - там switch начат до начала
цикла, а цикл закончен после завершения switch.
Ну, это особенность синтаксиса. Ни на фортране, ни на бейсике такое устройство мозг не взорвет с их неструктурированными goto.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981926
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нравился-бы вариант в котором в case-секциях стоит функция или предикат.
И при этом работает охранная логика исполнения первого условия которое вышло в true.
А не константа как в большинстве use-cases.

Пример:

Код: plaintext
1.
2.
3.
4.
letterClass c
   | c >= '0' && c <= '9' = "Digits or hex digits"
   | c >= 'A' && c <= 'H' = "Hex digits"
   | otherwise      = "I do not know what is it!"
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981948
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

чего-то похожего для expression можно добиваться вложениями условного оператора ?
И выглядеть будет похоже:
Код: plaintext
1.
2.
3.
           v =  (c >= '0' && c <= '9') ? "Digits or hex digits":
                (c >= 'A' && c <= 'H') ? "Hex digits":
                 "I do not know what is it!";



для statement, вероятно считается - зачем заменять if, если и так работает...

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

Это, бывает, явно эксплуатируют...
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39981997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента?
Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982073
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента?
Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch.


Похоже, что в такой формулировке я не понимаю, с чем соглашаться, а с чем нет.

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

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

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

Более того, я даже не знаю, ставится ли, и какое, формальное ограничение на число веток.
Basic, как счастливо взял от фортрана 255 как максимум, так и живет с этим.
Подозреваю, что для Си этот вопрос, почти традиционно, отдаётся на усмотрение реализации.

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

Прямо-таки почти навязывается встречный вопрос - должны ли мы немедленно вспомнить о господине Гослинге, например,
озаботившемуся вопросом реорганизации рабкрина неправильного языка в правильный для каждого браузера,
да более того - вообще для всего интернета.
Или пришло-таки время вспомнить о ржвачине...


Если серьёзно - не трожьте (в смысле не судите) Си лапками, замаранными структурным программированием.
А вот как именно и почему точно о вопросе структурированного оператора выбора не заботится C++ - это малёк за рамками моей компетенции.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982149
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На языке условного ассемблера алгоритм выглядит примерно так:
Код: 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.
cmp al, '\0';
je label_1;
cmp al, 'e';
je label_1;
cmp al, 'f';
je label_1;
cmp al, 'g';
je label_1;
and rax, 0x0f;
lea rbx, str;
push rbx;
push rax;
call strchr;
cmp rax, 0x0;
jne label_2;

label_1:
  xor rax, rax;   // return false
  ret;

label_2:
  add count, 1;
  mov rax, 1;     // return true
  ret;
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982177
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devпримерно так

Авотхрен. Если список вариантов плотный, то он выглядит как одна команда "jmp table[al]".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982198
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, финты ушами оптимизации не принципиальны.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982212
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу инженеришки Гослинга и его JVM байткодов (опкодов).

Есть отдельная инструкция tableswitch (0xAA) . По сути представляет аргументами case-константы и jump-offsets
куда надо прыгнуть. Вобщем-то и всё.

Современные сборочные конструкции со строками в switch возможно уже собираются как-то по другому.
На условных переходах.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982450
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кей Хорстман на Joker сетует об отсутствии expression для multi-way branch.
Якобы для if-else есть а для switch нету.

Упоминает о дихотомическом поиске для switch jump table.
И о sequental для patterns.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982908
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    switch (ch)
    {
    default:
        if ((ptr = strchr(str, ch)) == nullptr)
    case '\0':
    case 'e':
    case 'f':
    case 'g':
            return false;
        else
            count++;
        break;
    }


Хрень какая-то!
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982962
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008, где хрень?! Там всё отлично!
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39982983
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если принять во внимание пост Буби и также тот факт что Си считается портабельным ассемблером,
то в нем (ассемблере) можно сделать ВСЁ! Тоесть располагать ключевые слова языка в любом порядке для достижения
цели. Также как и __asm мнемоники вы можете располагать как угодно лишь-бы работало. И никто вас не покритикует.
И мы имеем дело с архаизмом.

И хотя мой консервативный мозг смотрит в сторону большей строгости и чеков в фазе компилляции
я готов махнуть рукой на этот стиль и просто согласиться с тем что разработчики Bell Labs были
первопроходцами и решали насущные проблемы разработки операционок и телефонного софта.

Для них стиль стоял не на первом месте, хотя для нас сегодня, измученных нарзаном PSV-Studio
и Сонаром такой подход кажется немыслимым кощунством.

По сути смысл обсуждения должен быть таков.

>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983021
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации
Оправдывает, если полезные эффекты необходимы для того, чтобы "вписать" машинный код в ограниченный объем памяти, например в Master Boot Record - 446 байт.
...
Рейтинг: 0 / 0
Очень интересны нюанс с оператором switch
    #39983044
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
mayton
>> Оправдывает ли такое резкое использование синтаксиса полезные эффекты и оптимизации
Оправдывает, если полезные эффекты необходимы для того, чтобы "вписать" машинный код в ограниченный объем памяти, например в Master Boot Record - 446 байт.

Как часто такое бывает в практике современного С/C++ разработчика?
...
Рейтинг: 0 / 0
25 сообщений из 236, страница 1 из 10
Форумы / C++ [игнор отключен] [закрыт для гостей] / Очень интересны нюанс с оператором switch
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]