Найти в Дзене

👩‍💻 Switch statement с диапазонами

👩‍💻 Switch statement с диапазонами Очередное расширение GNU. Допустим у нас ситуация... с такими условиями: void func(uint32_t var) { if (var >= VALUE_A_START && var <= VALUE_A_END) { /* CODE */} else if (var >= VALUE_B_START && var <= VALUE_B_END) { /* CODE */} else if (var >= VALUE_C_START && var <= VALUE_C_END) { /* CODE */} else if (var >= VALUE_D_START && var <= VALUE_D_END) { /* CODE */} else { /* CODE */} } В зависимости от попадания в нужный диапазон выполняется то или иное действие. Попробуем переписать при помощи switch: void func(uint32_t var) { switch (var) { case VALUE_A_START: case VALUE_A_1: case VALUE_A_2: // ... здесь куча других case case VALUE_A_30: case VALUE_A_31: case VALUE_A_END: /* CODE */ break; // Остальные секции: D, C, D ... default: break; } } Выглядит как-то не красиво и это не кажется. Если у нас будет очень большой диапазон проверяемых значений, код станет совсем нечитаем. Попробуем использовать расширения GNU и переписать код в более удобном д

👩‍💻 Switch statement с диапазонами

Очередное расширение GNU.

Допустим у нас ситуация... с такими условиями:

void func(uint32_t var)

{

if (var >= VALUE_A_START && var <= VALUE_A_END)

{ /* CODE */}

else if (var >= VALUE_B_START && var <= VALUE_B_END)

{ /* CODE */}

else if (var >= VALUE_C_START && var <= VALUE_C_END)

{ /* CODE */}

else if (var >= VALUE_D_START && var <= VALUE_D_END)

{ /* CODE */}

else

{ /* CODE */}

}

В зависимости от попадания в нужный диапазон выполняется то или иное действие.

Попробуем переписать при помощи switch:

void func(uint32_t var)

{

switch (var)

{

case VALUE_A_START:

case VALUE_A_1:

case VALUE_A_2:

// ... здесь куча других case

case VALUE_A_30:

case VALUE_A_31:

case VALUE_A_END:

/* CODE */

break;

// Остальные секции: D, C, D

...

default: break;

}

}

Выглядит как-то не красиво и это не кажется. Если у нас будет очень большой диапазон проверяемых значений, код станет совсем нечитаем.

Попробуем использовать расширения GNU и переписать код в более удобном для восприятия виде:

void func(uint32_t var)

{

switch (var)

{

case VALUE_A_START ... VALUE_A_END:

/* CODE */

break;

case VALUE_B_START ... VALUE_B_END:

            /* CODE */

            break;

case VALUE_C_START ... VALUE_C_END:

            /* CODE */

            break;

case VALUE_D_START ... VALUE_D_END:

            /* CODE */

            break;

default: break;

}

}

В итоге код стал проще выглядеть и восприниматься. Мы сохранили читаемость такую же как у "if", но приобрели скорость выполнения конструкции "switch"

Пусть это и расширение GNU, но clang собирает без ругани даже если указать -std=c11 , а не -std=gnu11

#c #switchcase #switch