#1 2025-08-06 08:13:10

filat18
Учасник
Зареєстрований: 2025-08-04
Повідомлень: 20

switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

Остання редакція filat18 (2025-08-06 08:13:41)

Неактивний

#2 2025-08-06 08:22:28

jokeer
Гість

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

#3 2025-08-06 08:34:36

jokeer
Гість

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

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

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

#4 2025-08-06 09:12:54

filat18
Учасник
Зареєстрований: 2025-08-04
Повідомлень: 20

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

Неактивний

#5 2025-08-06 09:23:52

jokeer
Гість

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

#6 2025-08-06 11:44:03

filat18
Учасник
Зареєстрований: 2025-08-04
Повідомлень: 20

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

jokeer пише:

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

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

Неактивний

#7 2025-08-06 12:12:43

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 155

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

Неактивний

#8 2025-08-06 23:21:04

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 447

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

В GNU C ...

Неактивний

#9 2025-08-07 08:21:24

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 155

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

Прикольно 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

Неактивний

#10 2025-08-07 12:32:14

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 572

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

jokeR пише:

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

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

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

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

Неактивний

#11 Вчора 06:52:31

filat18
Учасник
Зареєстрований: 2025-08-04
Повідомлень: 20

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

Неактивний

#12 Вчора 12:14:04

jokeR
Учасник
Зареєстрований: 2024-12-12
Повідомлень: 155

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

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

Неактивний

#13 Вчора 12:20:29

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 572

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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++.

Неактивний

#14 Вчора 12:41:16

dimich
Учасник
Зареєстрований: 2023-12-01
Повідомлень: 572

Re: switch працює лише з повними рівняннями, чи можливо вказати діапазони?

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

Неактивний

Швидке повідомлення

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

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