如何减少c中的if条件

时间:2012-06-19 09:38:17

标签: c

实际上我正在尝试减少if else条件,但我没有在C中做到如何做。

例如我的代码是

 if(this.Index==1100 && this.SubIndex==1)
 {
 putValue(Com_stMECUErr,this.Data);
  }

 else if(this.Index==1100 && this.SubIndex==2)
  {
  putValue(B_sbbvk,this.Data);
   }

 else if(this.Index==1100 && this.SubIndex==3)
  {
 putValue(Com_bMSVIdle,this.Data);
   }

  // haivng 100 more similar conditions

   }

7 个答案:

答案 0 :(得分:5)

如果值在连续范围内:

yourtypehere subIndexValues[] = {whatever, Com_stMECUErr, B_sbbvk, Com_bMSVIdle};

if(this.Index==1100)
{
  putValue(subIndexValues[this.SubIndex],this.Data);
}

或者您可以将if s混合用于索引,并将case s /数组用于特定范围。

答案 1 :(得分:3)

你可以摆脱一些像这样的冗余:

if (this.Index == 1100)
{
    switch (this.SubIndex)
    {
        case 1:
            putValue(Com_stMECUErr, this.Data);
            break;
        case 2:
            putValue(B_sbbvk, this.Data);
            break;
        case 3:
            putValue(Com_bMSVIdle, this.Data);
            break;
        ...
        default:
            ...
            break;
    }
}

答案 2 :(得分:2)

如果SubIndex未映射到特定值,则使用if或switch。

这是if方式。

if(this.Index == 1100) {
    if (this.SubIndex==1) putValue(Com_stMECUErr, this.Data);
    if (this.SubIndex==2) putValue(B_sbbvk, this.Data);
    if (this.SubIndex==3) putValue(Com_bMSVIdle,this.Data);
    // 100's more if's 
} else { //if this.Index != 1100
}

这是转换方式。

if(this.Index == 1100) {
    switch(this.SubIndex) {
        case 1: putValue(Com_stMECUErr, this.Data); break;
        case 2: putValue(B_sbbvk, this.Data); break;
        case 3: putValue(Com_bMSVIdle,this.Data); break;
        // 100's more cases
        default: break;
    }
    // 100's more if's 
} else { //if this.Index != 1100
}

如果SubIndex确实映射到特定值,那么您可以使用数组以最短的方式执行它。

YourDataType values[] = {
    whatever, 
    Com_stMECUErr, 
    B_sbbvk, 
    Com_bMSVIdle, 
    hundredsmore
}
if(this.Index == 1100) {
    putValue(values[this.SubIndex], this.Data);
}

答案 3 :(得分:1)

if (this.Index==1100) {
  if (this.SubIndex==1)
    putValue(Com_stMECUErr, this.Data);
  if (this.SubIndex==2)
    putValue(B_sbbvk, this.Data);
  if (this.SubIndex==3)
    putValue(Com_bMSVIdle,this.Data);
  // haivng 100 more similar conditions
}

或类似

if (this.Index==1100) {
  the_type_of_the_first_argument_of_putValue table1100[]= {
    Com_stMECUErr, // 1
    B_sbbvk,       // 2
    Com_bMSVIdle   // 3
    // haivng 100 more similar conditions
  };
  if (this.SubIndex<=no_of_entries_in_table1100)
    putValue(table1100[this.SubIndex-1], this.Data);
  else
    printf("value not found.");
}

答案 4 :(得分:0)

在这种情况下,您可以检查this.Index == 1100一次然后使用switch语句来测试子索引

即。因为您可以在所有条件下进行常见检查,所以您可以提取它:

if (this.Index==1100){
  switch(this.Subindex){
    case 1:
      ...
    case 2:
      ...
    }
}

答案 5 :(得分:0)

您可以使用switch语句缩短代码,并移动一个if语句:

if (this.Index == 1100) {
    switch(this.SubIndex) {
    case 1:
        putValue(Com_stMECUErr,this.Data);
        break;
    case 2:
        putValue(B_sbbvk,this.Data);
        break;
    case 3:
        putValue(Com_bMSVIdle,this.Data);
        break;
    default:
        break;
    }
}

答案 6 :(得分:0)

每个SubIndex是否映射到特定值?

在这种情况下,您可以创建一个HashMap或类似的跟踪映射的HashMap。如果你这样做,每当你必须检查值时,你可以做以下事情:

if(this.Index == 1100){
    putValue(someMap.get(this.SubIndex), this.Data);
}

这样做可以为您节省大量代码,特别是如果您必须在代码的不同部分多次检查映射。