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'を入力し、その内部の条件が発生した場合にのみブレークします。それ以外の場合は、デフォルトのケースにジャンプします。ラベルや後藤以外に、これを行う他の方法はありますか?
goto
勝利のために
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]があるとします。これらの場合(おそらくいくつかの条件がテストされた後)にtest_char()から2を返し、ケース2:ハンドラーをデフォルトの処理スイッチステートメントに追加します。
これが最良の答えかどうかはわかりませんが、次のようになります。
ラベルを絶対に使用せず、ケースを現在の順序で保持したい場合は、ケース「a」の後に続けて、各冒頭のif(ch!= 'a')を確認してください。その後のケースでは、条件が真の場合にのみステートメントを実行します。
switch(ch){
case 'a':
// do something
case 'b':
if(ch != 'a') {
//do something
}
//repeat for each subsequent case
default:
//do something
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.
}
}
まあ、投稿は本当に古いですが、誰にでも答えるには、「goto default」と書くだけです。そして問題なく直接デフォルトのケースにジャンプします。
例:
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;
}
チェックする条件がケースに依存するため(または条件をチェックする前にケースを最初に評価する必要があるため)、最初に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;
}
この構造では、以前のケースからデフォルトのケースに切り替えることができます。外側のループを壊すのにも便利です。