Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

dimich
Вчора 12:41:16

Щодо вашого початкового питання, в деяких випадках має сенс замість switch використати щось інше. Якщо діапазони можуть змінюватись під час роботи програми, можна було би використати таблицю пошуку з гарантовано константним часом доступу. Якщо змінна була би не int, а, наприклад, double, то можна було би реалізувати бінарний пошук по таблиці діапазонів. Для вибору найбільш оптимального рішення потрібно брати до уваги як характер тих діапазонів, так і відмінності в гілках, що відповідають кожному з них.

dimich
Вчора 12:20:29
filat18 пише:

І чому ця форма запису ніде не задокументована?!

Як це не задокументована, якщо вам посилання на документацію дали? smile

А мало де згадується в підручниках та туторіалах, бо це нестандартне розширення GCC. З іншими компіляторами воно не працюватиме, стандарт C++ таку форму запису не визначає (принаймні поки що). До того ж, це розширення мови C, але більшість розширень GNU C можна використовувати в C++:

and you can also use most of the C language extensions in your C++ programs

Іноді з часом деякі розширення включаються в стандарт.
У GNU C є й інші цікаві розширення, але не всі вони працюють в C++.

jokeR
Вчора 12:14:04

І чому ця форма запису ніде не задокументована?!

Задокументована ж. Просто це компіляторо-залежне розширення, наприклад sdcc так не вміє.

filat18
Вчора 06:52:31

Honey, дякую!
І чому ця форма запису ніде не задокументована?!

dimich
2025-08-07 12:32:14
jokeR пише:

цей код транслюється в таке...

Код з послідовними case:

case 1:
case 2:
...
case 31:
    rIndex = 100;
    break;

транслюватиметься в таке саме. Case ranges - це просто синтаксичний цукор, для зручності.

jokeR
2025-08-07 08:21:24

Прикольно wink avr-gcc так вміє.
І воно дійсно працює як діапазон

    rIndex = 0;
    switch (rIndex) {
        case 1 ... 31:
            rIndex = 100;
            break;
        default:
            rIndex = 101;
    };

цей код транслюється в таке

        lds r24,rIndex
        mov __tmp_reg__,r24
        lsl r0
        sbc r25,r25
        sbiw r24,1
        sbiw r24,31
        brsh .L2
        ldi r24,lo8(100)
        sts rIndex,r24
        rjmp .L4
.L2:
        ldi r24,lo8(101)
        sts rIndex,r24
.L4:

Константи 1 і 31 видно очима wink

Honey
2025-08-06 23:21:04

В GNU C ...

jokeR
2025-08-06 12:12:43

Тоді можна використати wink
Взагалі щоб задати правильне питання, треба знати половину відповіді. А якщо знаєш половину відповіді - іншу половину, скоріше за все, теж знаєш wink

filat18
2025-08-06 11:44:03
jokeer пише:

Якщо відповідь не подобається, можна її проігнорувати smile

ні, я якраз питав про протилежний варіант  smile

jokeer
2025-08-06 09:23:52

Якщо відповідь не подобається, можна її проігнорувати smile

filat18
2025-08-06 09:12:54

Чому на форумі не має кнопки Прийняти рішення/відповідь?

jokeer
2025-08-06 08:34:36

так то можна написати щось типу

switch (something)
{
   case 1:
   case 2:
     do_12();
  break;
   default:
     do_default();
   break;
}

Залежить від того, що ви хочете отримати, як буде зручніше і як зрозуміліше. В особливо наркоманському випадку код можна і згенерувати wink

jokeer
2025-08-06 08:22:28

ніт. switch порівнює вираз з константами

filat18
2025-08-06 08:13:10

switch  - це оператор, що перевіряє чи відповідає перемінна окремим значенням.
Чи можно у цьому операторі вказати умови перевірки відповідності до окремих діапазонів?
Наприклад, якщо пермінна є int х, то перевірити наступні віпадки: 1. х == 1; 2. х > 3 & x < 5; 3. x == 6; 4. x >= 8 ...?

Підвал форуму