Ответ 1
goto
Для Win
switch (ch) {
case 'a':
if (1) goto LINE96532;
break;
case 'b':
if (1) goto LINE96532;
break;
LINE96532:
default:
//
break;
}
switch(ch){
case 'a':
//do something, condition does not match so go to default case
//don't break in here, and don't allow fall through to other cases.
case 'b':
//..
case 'c':
//..
case '_':
//...
default:
//
break;
}
В операторе switch, как и выше, я вхожу в регистр "a", я ломаюсь, только если внутри него происходит условие, в противном случае я хочу перейти к случаю по умолчанию. Есть ли другой способ сделать это, а не ярлыки или gotos?
goto
Для Win
switch (ch) {
case 'a':
if (1) goto LINE96532;
break;
case 'b':
if (1) goto LINE96532;
break;
LINE96532:
default:
//
break;
}
Просто измените порядок дел, чтобы этот случай был последним:
switch(ch){
case 'b':
//..
case 'c':
//..
case '_':
//...
case 'a':
//do something, condition does not match so go to default case
if (condition)
break;
//don't break in here, and don't allow fall through to other cases.
default:
//
break;
}
Если условие не зависит от случаев, зачем его помещать внутри?
if (!condition){
// do default
}else{
switch(ch){
case 'a':
// do a
break;
...
}
}
Измените свой код:
int test_char(char ch)
{
switch(ch) {
case 'a': if (condition) return 0; break;
case 'b': // ...
default: return -1;
}
return 1;
}
...
// defaults processing switch
switch(test_char(ch)) {
case 0: break; // condition met
case 1: // default processing
default: // case not handled by test_char
}
Это также добавляет преимущества гибкости тестирования нескольких классов обработки по умолчанию. Скажем, у вас есть группа символов [c, d, e, f], которые имеют общую логику. Просто верните 2 из test_char() для этих случаев (возможно, после того, как некоторые условия были протестированы) и добавьте case 2: обработчик к оператору switch по умолчанию.
Я не уверен, что это лучший ответ, но вот он:
Если вы абсолютно не хотите использовать ярлыки и хотите сохранить случаи в их текущем порядке, вы можете продолжить после случая "a", а затем проверить, чтобы увидеть (ch!= 'a') на начало каждого последующего случая, только выполнение оператора, если условие истинно:
switch(ch){
case 'a':
// do something
case 'b':
if(ch != 'a') {
//do something
}
//repeat for each subsequent case
default:
//do something
break;
}
Это, вероятно, не самый эффективный способ решить вашу проблему, но он должен выполнить то, что вы хотите.
Если вы сначала должны иметь инструкции switch, потому что условие, которое вы проверяете, зависит от случая (или случай должен быть оценен первым, прежде чем вы сможете проверить условие), просто установите флаг внутри switch
случаях, и если этот флаг установлен, выполните операцию по умолчанию. Например:
int default_true = 0;
switch (case_value)
{
case 'a': /* if the condition is true, set the default_true flag */
case 'b': /* if the condition is true, set the default_true flag */
//...
default: default_flag = 1; // set the default_true flag to true
}
if (default_flag)
{
//place your "default" code here rather than inside the switch statement
//this prevents code reduplication
}
Вот что я сделал:
char ucResult = 1;
switch(ch){
case 'a':
if(ucResult){
// do something
if(error) ucResult = 0;
}
case 'b':
if(ucResult){
// do something
if(error) ucResult = 0;
}
case 'c':
if(ucResult){
// do something
if(error) ucResult = 0;
}
case '_':
if(ucResult){
// do something
if(error) ucResult = 0;
}
default:
//
break;
}
С этой структурой вы можете переключиться на случай по умолчанию из любых предыдущих случаев. Удобен и для размыкания внешних петель.
Надеюсь, мое решение ответит на ваш вопрос. Просто позвольте этим случаям следовать полностью (начиная с примера соответствия), но используйте условие, чтобы отключить последующие случаи от запуска.
typedef enum boolean
{
FALSE = 0, TRUE = 1
} bool;
void pstuff(char input)
{
bool _skip = FALSE;
switch(input)
{
case 'a':
printf("Case a.");
_skip = TRUE;
case 'b':
if(!_skip)
{
printf("Case b.");
_skip = TRUE;
}
case 'c':
if(!_skip)
{
printf("Case c.");
_skip = TRUE;
}
//...
default:
printf("Done!\n"); //Always gets printed.
}
}
Ну, пост действительно старый, но ответить всем: Вы можете просто написать "Перейти к умолчанию;" и вы без проблем перейдете к стандартному случаю.
Пример:
switch (value)
{
case value1:
// do something;
break;
case value2:
// do something
break;
.
.
.
.
case value20:
// do something
**goto default;**
.
.
case valueN:
// do something
break;
default:
// do something
break;
}
переход по умолчанию
- используйте метку пустого ярлыка чуть выше значения по умолчанию (с очевидным именем)
- Используйте
goto case "case-labelname"
, чтобы перейти, а затем упасть до значения по умолчанию.
Пример
switch (VAR)
{
case "a":
// dO STUFF !
if(COND)
goto case "DFLT";
// dO STUFF !
break;
case "B":
// dO STUFF !
break;
case "C":
// dO STUFF !
IF(COND)
goto case "DFLT";
break;
case "DFLT":
default:
// dO DEFAULT
break;
}