【问题标题】:Many conditions, reducing code size [closed]许多条件,减少代码大小
【发布时间】:2015-07-13 07:42:47
【问题描述】:

除了在 if 中使用 if 分支来检查并满足所有必需条件之外,还有其他好的解决方案吗?像这样写的代码看起来有点大,我想减少代码大小,但要适合我的需要。

if(a>0 && b>0 && c>0) 
{
    if(a==d && b==e && c==f)
    {
         if(a<FIELD_HEIGHT && b<FIELD_WIDTH)
         {
             if(true) 
             {

             }
         }
    }
}

【问题讨论】:

  • 您正在寻找的术语是减少 嵌套,而不是代码大小(这意味着编译器生成的机器代码更少)。答案很大程度上取决于if 语句块内发生的情况,只有更多if 语句或其他内容?
  • @JoachimPileborg 是的,如果可能的话,我需要避免这么多的 if 语句。但在我的情况下,我有 3 个不同的组来检查不同的东西,当我编写所​​有这些组时,它对我来说看起来很大,这就是我想要减少代码大小的原因。
  • 还有一点数学可能会有所帮助:en.wikipedia.org/wiki/Boolean_algebra
  • 这些变量是signed 还是unsigned?或者不太具体,它们是如何定义的?

标签: c if-statement coding-style


【解决方案1】:

您可以使用逻辑 AND 运算符 (&amp;&amp;):

if (cond1 && cond2 && cond3) {
  // action
}

相当于:

if (cond1) {
  if (cond2) {
    if (cond3) {
      // action
    }
  }
}

只要您不需要特定于任何这些条件的else 子句,这很有用。

条件将从左侧进行评估,因此如果 cond1 将是 falsecond2cond3 将不会被评估。


编辑:如果您有许多条件需要为真才能采取行动,并且您关心代码的可读性,我会首先将它们分组到布尔变量中,即:

int isCar = has4Wheels && hasBreaks && hasEngine;
int isASportsCar = hasLargeEngine && hasLowSuspension && hasManualControls;
int isFerrari = isV12 && isRed && hasANiceLogo;

if (isCar && isASportsCar && isFerrari) {
  // action
}

示例可能很愚蠢,但你明白了。

【讨论】:

  • "转储"?不,这是真的!我再次为您编辑中的好例子投了赞成票……! :-)
  • @alk 这就是法拉利的魔力:D
【解决方案2】:

由于您的代码 sn-p 没有任何 else 语句,您可以将代码缩减为

 if (<condition1> && <condition2> && <condition3>)

等等。

【讨论】:

  • 是的,但我有很多像你写的条件,检查不同的东西不能一起写
  • @MasterYoda 那到底是怎么回事?你能举个例子吗?
  • @MasterYoda: ".. 不能一起写" 为什么不呢?如果详细信息相关,您可能希望显示详细信息。这不是猜谜游戏。
  • @MasterYoda:以有意义的方式对条件进行分组,并添加换行符来分隔这些组。
  • @MasterYoda 你很困惑。大多数人提出的格式更改,正如他们多次告诉您的那样,不会更改生成的代码的大小,也不会更改它使用的内存量。相同的代码。只是格式不同。
【解决方案3】:

由于您没有与 if 关联的 else 子句,因此将所有条件放在一起,例如:

if (thisCondition && thatCondition ..) {}

【讨论】:

    【解决方案4】:
    1. 如果变量abc 被声明为unsigned,那将减少if
    2. 如果不存在特定的 else 块,则可以合并两个 if 语句

    然后您可以将代码缩减为

    unsigned a, b, c;    // if declared as unsigned or if d, e, f are known to be positive
    
    if (a == d && b == e && c == f && a < FIELD_HEIGHT && b < FIELD_WIDTH) {
        ...
    }
    

    【讨论】:

      【解决方案5】:

      跟进my comment here

      if (   (a>0 && a<FIELD_HEIGHT && a==d)
          && (b>0 && b<FIELD_WIDTH && b==e)
          && (c>0 && c==f)
         )
      {
        ...
      }
      

      并假设变量是unsigned 整数:

      if (   (a && a<FIELD_HEIGHT && a==d)
          && (b && b<FIELD_WIDTH && b==e)
          && (c && c==f)
         )
      {
        ...
      }
      

      【讨论】:

        【解决方案6】:

        我觉得还可以:

        if(a>0 && b>0 && c>0) 
        {
            if(a==d && b==e && c==f)
            {
                 if(a<FIELD_HEIGHT && b<FIELD_WIDTH)
                 {
        
                 }
            }
        }
        

        在你的代码中,最后的判断:“if(true)”是多余的

        【讨论】:

          猜你喜欢
          • 2012-01-03
          • 1970-01-01
          • 2020-03-24
          • 2015-02-24
          • 1970-01-01
          • 2020-04-23
          • 2021-08-29
          • 1970-01-01
          • 2020-10-17
          相关资源
          最近更新 更多