Ви не увійшли.
switch - це оператор, що перевіряє чи відповідає перемінна окремим значенням.
Чи можно у цьому операторі вказати умови перевірки відповідності до окремих діапазонів?
Наприклад, якщо пермінна є int х, то перевірити наступні віпадки: 1. х == 1; 2. х > 3 & x < 5; 3. x == 6; 4. x >= 8 ...?
Остання редакція filat18 (2025-08-06 08:13:41)
Неактивний
ніт. switch порівнює вираз з константами
так то можна написати щось типу
switch (something)
{
case 1:
case 2:
do_12();
break;
default:
do_default();
break;
}
Залежить від того, що ви хочете отримати, як буде зручніше і як зрозуміліше. В особливо наркоманському випадку код можна і згенерувати
Якщо відповідь не подобається, можна її проігнорувати
Тоді можна використати
Взагалі щоб задати правильне питання, треба знати половину відповіді. А якщо знаєш половину відповіді - іншу половину, скоріше за все, теж знаєш
Неактивний
Прикольно 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 видно очима
Неактивний
цей код транслюється в таке...
Код з послідовними case:
case 1:
case 2:
...
case 31:
rIndex = 100;
break;
транслюватиметься в таке саме. Case ranges - це просто синтаксичний цукор, для зручності.
Неактивний
І чому ця форма запису ніде не задокументована?!
Як це не задокументована, якщо вам посилання на документацію дали?
А мало де згадується в підручниках та туторіалах, бо це нестандартне розширення GCC. З іншими компіляторами воно не працюватиме, стандарт C++ таку форму запису не визначає (принаймні поки що). До того ж, це розширення мови C, але більшість розширень GNU C можна використовувати в C++:
and you can also use most of the C language extensions in your C++ programs
Іноді з часом деякі розширення включаються в стандарт.
У GNU C є й інші цікаві розширення, але не всі вони працюють в C++.
Неактивний
Щодо вашого початкового питання, в деяких випадках має сенс замість switch використати щось інше. Якщо діапазони можуть змінюватись під час роботи програми, можна було би використати таблицю пошуку з гарантовано константним часом доступу. Якщо змінна була би не int, а, наприклад, double, то можна було би реалізувати бінарний пошук по таблиці діапазонів. Для вибору найбільш оптимального рішення потрібно брати до уваги як характер тих діапазонів, так і відмінності в гілках, що відповідають кожному з них.
Неактивний