После прочтения всех ответов и дополнительных исследований я получаю несколько вещей.
Case statements are only 'labels'
В С, согласно спецификации,
§6.8.1 Помеченные заявления:
labeled-statement:
identifier : statement
case constant-expression : statement
default : statement
В C нет ни одного предложения, которое допускает «помеченное объявление». Это просто не часть языка.
Так
case 1: int x=10;
printf(" x is %d",x);
break;
Это не скомпилируется , см. Http://codepad.org/YiyLQTYw . GCC выдает ошибку:
label can only be a part of statement and declaration is not a statement
Даже
case 1: int x;
x=10;
printf(" x is %d",x);
break;
это также не компилируется , см. http://codepad.org/BXnRD3bu . Здесь я также получаю ту же ошибку.
В C ++, согласно спецификации,
помечено-объявление разрешено, но помечено -инициализация не допускается.
Смотрите http://codepad.org/ZmQ0IyDG .
Решение такого условия два
Либо используйте новую область видимости, используя {}
case 1:
{
int x=10;
printf(" x is %d", x);
}
break;
Или используйте пустышку с меткой
case 1: ;
int x=10;
printf(" x is %d",x);
break;
Объявите переменную перед switch () и инициализируйте ее различными значениями в выражении case, если она удовлетворяет вашему требованию
main()
{
int x; // Declare before
switch(a)
{
case 1: x=10;
break;
case 2: x=20;
break;
}
}
Еще несколько вещей с оператором switch
Никогда не записывайте в коммутатор какие-либо операторы, которые не являются частью какой-либо метки, потому что они никогда не будут выполнены
switch(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Смотрите http://codepad.org/PA1quYX3 .