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

Код: 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
19.07.2020, 21:10
    #39981556
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
В С много такой гадости, С изобретали не в угоду читабельности, все было направлено на производительность, тогда это было актуально.
...
Рейтинг: 0 / 0
19.07.2020, 22:14
    #39981567
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
petrav
Это же за гранью добра и зла. Впервые сегодня увидел такое.

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

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

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

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

Операторы case / default нужно воспринимать как метки для оператора goto. А оператор switch — это условный оператор goto. И всё встаёт на свои места. Конструкция становится логичной и простой.
...
Рейтинг: 0 / 0
20.07.2020, 01:20
    #39981599
mini.weblab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :)
(я не знала, что switch так работает)
...
Рейтинг: 0 / 0
20.07.2020, 10:25
    #39981677
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
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
20.07.2020, 10:43
    #39981687
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
do ... while (false) - лишний.
...
Рейтинг: 0 / 0
20.07.2020, 13:18
    #39981770
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
mini.weblab
если в Duff's device использование приема оправдано, то в коде выше это действительно на грани добра и зла :)
(я не знала, что switch так работает)

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

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

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

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

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

Может не critical, но тем не меннее какой-то важности чтоб обратить внимание.
...
Рейтинг: 0 / 0
20.07.2020, 15:53
    #39981876
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
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
20.07.2020, 17:24
    #39981926
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
Мне нравился-бы вариант в котором в 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
20.07.2020, 18:09
    #39981948
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
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
20.07.2020, 20:05
    #39981997
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента?
Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch.
...
Рейтинг: 0 / 0
21.07.2020, 00:42
    #39982073
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
mayton
booby, ну ты согласен что switch накладывает слишком много ограничений на use-case аргумента?
Это вроде контракт на неизменяемость условий с тех пор как мы вошли в секцию switch.


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

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

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

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

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

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

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


Если серьёзно - не трожьте (в смысле не судите) Си лапками, замаранными структурным программированием.
А вот как именно и почему точно о вопросе структурированного оператора выбора не заботится C++ - это малёк за рамками моей компетенции.
...
Рейтинг: 0 / 0
21.07.2020, 10:40
    #39982149
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
На языке условного ассемблера алгоритм выглядит примерно так:
Код: 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
21.07.2020, 12:13
    #39982177
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
rdb_devпримерно так

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

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

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

Упоминает о дихотомическом поиске для switch jump table.
И о sequental для patterns.
...
Рейтинг: 0 / 0
23.07.2020, 05:28
    #39982908
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
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
23.07.2020, 10:36
    #39982962
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
SQL2008, где хрень?! Там всё отлично!
...
Рейтинг: 0 / 0
23.07.2020, 11:20
    #39982983
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Очень интересны нюанс с оператором switch
Если принять во внимание пост Буби и также тот факт что Си считается портабельным ассемблером,
то в нем (ассемблере) можно сделать ВСЁ! Тоесть располагать ключевые слова языка в любом порядке для достижения
цели. Также как и __asm мнемоники вы можете располагать как угодно лишь-бы работало. И никто вас не покритикует.
И мы имеем дело с архаизмом.

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

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

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

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

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


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