如何软件分开开关盒内的盒子

时间:2017-10-26 16:48:50

标签: c switch-statement

我有一个switch case,有4个案例具有相同的通用代码,但我需要为它们初始化变量:

 int a,b,c;
 switch(type)
 {
   case A:
   case B:
   case C: 
   case D:
     foo(a,b,c);
 }

我目前所拥有的是a = type == A ? 1 : 2;和一些复杂的变量:

if(type == A)
  b = 1;
else if(type == B)
  b = 5;
else
  b = 2;

这很有效,但在我看来看起来很难看,而且不是很流利。我可以完全划分案例,但我想避免在我的代码中复制粘贴。

我希望做的是:

 int a,b,c;
 switch(type)
 {
   case A:
     a = 1;
     b = 1;
   case B:
     a = 2;
     b = 5;
   case C: 
   case D:
     a = 1;
     b = 2;
     foo(a,b,c);
 }

但是这显然无效,因为即使案例是A或B,case D变量赋值也会发生。有没有办法以整洁(和工作:)的方式实现这一点?

编辑: switch实际上是为了过滤其他个案,所以我确实希望这些特定4个案例中的foo()

4 个答案:

答案 0 :(得分:5)

根据您的代码,您可以执行以下操作:

<div class="col-xs-12 col-sm-12">
     <fieldset>
          <input type="radio" formControlName="specificPilot" [value]="1" [ngClass]="{'td-radio-error': displayMessage.specificPilot}" (check)="radioSetValidator(changeForm.get('generalQuestionsFG.specificPilot'),[changeForm.get('generalQuestionsFG.pilotTransits')])">Yes
          <input type="radio" formControlName="specificPilot" [value]="0" [ngClass]="{'td-radio-error': displayMessage.specificPilot}" (check)="radioSetValidator(changeForm.get('generalQuestionsFG.specificPilot'),[changeForm.get('generalQuestionsFG.pilotTransits')])">No
          {{this.changeForm.get('generalQuestionsFG.specificPilot').value}}
     </fieldset>
</div>
<div class="col-xs-12 col-sm-12">
     <textarea class="form-control" rows="2" formControlName="pilotTransits" style="width:100%" placeholder="Provide Transits for Pilot(s)"
     *ngIf="changeForm.get('generalQuestionsFG.specificPilot').value==='1'"> </textarea>
</div>

为了证明这个使用int a,b,c; switch(type) { case A: a = 1; b = 1; goto call_foo; case B: a = 2; b = 5; goto call_foo; case C: case D: a = 1; b = 2; call_foo: foo(a,b,c); break; // [...] more cases } ,恕我直言,你在这个结构中的逻辑需要更加复杂。

答案 1 :(得分:4)

使用显式控制变量清楚说明:

int a, b, c;
int run_foo = 1;

switch(type) {
case A:
  a = 1; b = 1;
  break;
case B:
  a = 2; b = 5;
  break;
case C: 
case D:
  a = 1; b = 2;
  break;
default:
  run_foo = 0;
  break;
}
if (run_foo) { foo(a,b,c); }

答案 2 :(得分:3)

因此,您无需为foo()中的类型调用{A, B, C, D},是吗?解决方案很简单:

int a, b, c;
switch (type) {
case A:
    a = 1;
    b = 1;
    break;
case B:
    a = 2;
    b = 5;
    break;
case C: 
case D:
    a = 1;
    b = 2;
    break;
default:
    return;      // no foo() for this case
}

foo(a, b, c);

答案 3 :(得分:2)

除了案例C,并且在switch语句中使用goto时,你不能避免硬中断;随着维护人员效仿,只会导致越来越多的意大利面条。如果您只是想减少交换机中的代码行数,可以使用函数或宏。

#define DoFooCase(_a, _b, _c) a = _a; b = _b; foo(a, b, _c);

switch(t) // Can't use type, it's keyword.
{
    case A:
        DoFooCase(1, 1, c);
        break;
    case B:
        DoFooCase(2, 5, c);
        break;
    case C:
    case D:
        DoFooCase(1, 2, c);
        break;
}