Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как работает switch в C

Ivan Bystrov Ученик (129), закрыт 1 год назад
case label does not reduce to an integer constant такая ошибка и не понимаю почему не работает
Лучший ответ
Папа Высший разум (145103) 1 год назад
Все кейсы должны быть константами времени компиляции.
Вот так работает:
 #define A 100
#define B 10

switch (x) {
case A: blahBlahBlah(); break;
case B: yadaYadaYada(); break;
}
Вот так не работает:
 const int A = 100;
const int B = 10;

switch (x) {
case A: blahBlahBlah(); break;
case B: yadaYadaYada(); break;
}
не говоря уже о переменных.
Потому что в Си константы не являются таковыми для компилятора, даже если в процессе оптимизации он их свернёт в фактическую константу.
СергейГений (59917) 1 год назад
Второй вариант вполне законный, ибо А и Б константы компиляции.
По крайней мере VS кушает.
Папа Высший разум (145103) Сергей Степанов, они константы, но они не совсем константы. Это другое. Для разработчиков компиляторов Си и Сиплюсплюс в дурках отдельные палаты есть. А микрософт, бывает, реализует что-то лучше, чем другие. Но не все компиляторы это кушают. Поэтому в C++ есть constexpr.
Остальные ответы
S.H.I. Оракул (68566) 1 год назад
Конструкция switch-case в языке программирования C позволяет сравнить некоторое выражение с набором значений. Она имеет следующую форму:
 switch(выражение) { 
case значение_1:
инструкции_1;
break;
case значение_2:
инструкции_2;
break;
...................
case значение_N:
инструкции_N;
break;
default:
инструкции;
}
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями после оператора case. И если совпадение будет найдено, то будет выполняться определенный блок case.

В конце каждого блока case ставится оператор break, чтобы избежать выполнения последующих блоков case/default.

Что касается ошибки “case label does not reduce to an integer constant”, она обычно возникает, когда метка case не является целочисленной константой. В языке C метки case должны быть константными выражениями, они должны быть вычислены на этапе компиляции. Если вы хотите ветвиться на значениях времени выполнения, вам нужно использовать if-else вместо switch.
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (267602) 1 год назад
Нужен конкретный код. А так, эта ошибка дословно означает, что компилятор требует целочисленной константы, а не переменной. Например: #define X_VALUE 5

Вот еще примеры таких допустимых констант:

 #include  

#define MY_CONSTANT 42

enum MyEnum {
VALUE_A = 10,
VALUE_B = 20
};

int main() {
int choice = 1;

switch (choice) {
case 1: // целочисленная константа
printf("Выбрано 1\n");
break;
case MY_CONSTANT: // макрос как целочисленная константа
printf("Выбрано MY_CONSTANT\n");
break;
case VALUE_A: // перечисление как целочисленная константа
printf("Выбрано VALUE_A\n");
break;
default:
printf("Выбрано что-то другое\n");
}

return 0;
}


Иван Сигаев Искусственный Интеллект (155175) 1 год назад
Возможно пытаешься использовать "строки" ?

char test[]="Test";

switch(test){
case "test":
итд
Похожие вопросы