Ответ Йоханнеса правильный, но я чувствую, что не совсем ясно по аспекту проблемы.
Пример, который он приводит, объявляет и инициализирует переменную i
в случае 1, а затем пытается использовать ее в случае 2. Его аргумент заключается в том, что если бы переключатель перешел прямо к случаю 2, i
использовался бы без инициализирован, и именно поэтому есть ошибка компиляции. В этот момент можно подумать, что не будет проблем, если переменные, объявленные в одном случае, никогда не будут использоваться в других случаях. Например:
switch(choice) {
case 1:
int i = 10; // i is never used outside of this case
printf("i = %d\n", i);
break;
case 2:
int j = 20; // j is never used outside of this case
printf("j = %d\n", j);
break;
}
Можно ожидать, что эта программа будет скомпилирована, поскольку i
и j
используются только внутри случаев, которые их объявляют. К сожалению, в C ++ он не компилируется: как объяснил Ciro Santilli 包子 露 宪 六四 jump 法轮功 , мы просто не можем перейти к case 2:
, потому что это пропустит объявление с инициализацией i
и хотя case 2
вообще не использует i
, это все еще запрещено в C ++.
Интересно, что с некоторыми корректировками (от #ifdef
до #include
соответствующего заголовка и точки с запятой после меток, поскольку за метками могут следовать только операторы, а объявления не считаются операторами в C ), эта программа компилируется как C:
// Disable warning issued by MSVC about scanf being deprecated
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#ifdef __cplusplus
#include <cstdio>
#else
#include <stdio.h>
#endif
int main() {
int choice;
printf("Please enter 1 or 2: ");
scanf("%d", &choice);
switch(choice) {
case 1:
;
int i = 10; // i is never used outside of this case
printf("i = %d\n", i);
break;
case 2:
;
int j = 20; // j is never used outside of this case
printf("j = %d\n", j);
break;
}
}
Благодаря онлайн-компилятору, например http://rextester.com, вы можете быстро попытаться скомпилировать его как C или C ++, используя MSVC, GCC или Clang. Для C он всегда работает (просто не забудьте установить STDIN!), А для C ++ его не принимает компилятор.