0

实际上我正在尝试减少 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

   }
4

7 回答 7

5

如果值在连续范围内:

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

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

或者您可以混合使用ifs 作为索引,使用cases/arrays 作为特定范围。

于 2012-06-19T09:43:20.033 回答
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;
    }
}
于 2012-06-19T09:43:15.247 回答
2

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

这就是如果的方式。

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);
}
于 2012-06-19T09:52:34.363 回答
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.");
}
于 2012-06-19T09:43:02.610 回答
0

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

在这种情况下,您可以制作一个 HashMap 或类似的东西来跟踪映射。如果你这样做了,每当你必须检查值时,你可以执行以下操作:

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

这样做可以节省大量代码,尤其是当您必须在代码的不同部分多次检查映射时。

于 2012-06-19T09:45:02.403 回答
0

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

即,由于您对所有条件都有共同的检查,因此您可以提取它:

if (this.Index==1100){
  switch(this.Subindex){
    case 1:
      ...
    case 2:
      ...
    }
}
于 2012-06-19T09:40:56.993 回答
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;
    }
}
于 2012-06-19T09:43:21.813 回答