La réponse de JohannesD est correcte, mais je trouve qu'elle n'est pas tout à fait claire sur un aspect du problème.
L'exemple qu'il donne déclare et initialise la variable i
dans le cas 1, puis essaie de l'utiliser dans le cas 2. Son argument est que si le switch allait directement au cas 2, i
serait utilisé sans être initialisé, et c'est pourquoi il y a une erreur de compilation. À ce stade, on pourrait penser qu'il n'y aurait pas de problème si les variables déclarées dans un cas n'étaient jamais utilisées dans d'autres cas. Par exemple:
switch(choice) {
case 1:
int i = 10; // i n'est jamais utilisé en dehors de ce cas
printf("i = %d\n", i);
break;
case 2:
int j = 20; // j n'est jamais utilisé en dehors de ce cas
printf("j = %d\n", j);
break;
}
On pourrait s'attendre à ce que ce programme compile, puisque à la fois i
et j
sont utilisés uniquement à l'intérieur des cas qui les déclarent. Malheureusement, en C++ cela ne compile pas : comme l'a expliqué Ciro Santilli 包子露宪 六四事件 法轮功, nous ne pouvons tout simplement pas sauter à case 2:
, car cela passerait à côté de la déclaration avec l'initialisation de i
, et même si case 2
n'utilise pas du tout i
, cela est toujours interdit en C++.
De manière intéressante, avec quelques ajustements (un #ifdef
pour #include
l'en-tête appropriée, et un point-virgule après les labels, car les labels ne peuvent être suivis que d'instructions, et les déclarations ne comptent pas comme instructions en C), ce programme compile en C :
// Désactive l'avertissement émis par MSVC sur le fait que scanf est obsolète
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#ifdef __cplusplus
#include
#else
#include
#endif
int main() {
int choice;
printf("Veuillez entrer 1 ou 2 : ");
scanf("%d", &choice);
switch(choice) {
case 1:
;
int i = 10; // i n'est jamais utilisé en dehors de ce cas
printf("i = %d\n", i);
break;
case 2:
;
int j = 20; // j n'est jamais utilisé en dehors de ce cas
printf("j = %d\n", j);
break;
}
}
Grâce à un compilateur en ligne comme http://rextester.com, vous pouvez rapidement essayer de le compiler en tant que C ou C++, en utilisant MSVC, GCC ou Clang. En C, cela fonctionne toujours (n'oubliez pas de définir STDIN !), en C++ aucun compilateur ne l'accepte.
1 votes
Quel code essayez-vous de compiler? Quel compilateur utilisez-vous? Avez-vous placé chaque bloc
case
entre accolades?5 votes
C'est un message d'erreur étonnamment compliqué