Прочитавши всі відповіді та ще кілька досліджень, я отримую кілька речей.
Case statements are only 'labels'
В C, згідно специфікації,
§ 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(a)
{
printf("This will never print"); // This will never executed
case 1:
printf(" 1");
break;
default:
break;
}
Дивіться http://codepad.org/PA1quYX3 .