简化多个OR条件

时间:2017-04-24 12:33:55

标签: c performance

我有以下代码:

if(IND_1 == 0 || IND_2 == 0 || IND_3 == 0 || IND_4 == 0 || IND_5 == 0 
        || IND_6 == 0 || IND_7 == 0 || IND_8 == 0 || IND_9 == 0 ) 
    Do something;

但我觉得这个代码的问题是需要很多处理能力。 所以,我尝试了以下格式

if((IND_1,IND_2,IND_3)==0)

但没有奏效。

  

发出意外的令牌错误“,”

也尝试过这种格式:

if((IND_1||IND_2||IND_3||IND_4||IND_5||IND_6||IND_7||IND_8||IND_9) == 0 ) 
    printf("Apple");

它也没用。没错。但不打印Apple。

是否有其他简化此代码的方法? 因为我有这种类型的代码有28次不同的变量,所以想到它。还要记住程序处理能耗。

5 个答案:

答案 0 :(得分:5)

  

是否有其他简化此代码的方法?

怎么样:

if (!(IND_1 && IND_2 && ... && IND_n))
{
  /* Do something. */
  ...

答案 1 :(得分:4)

我不会说你的解决方案在处理能力方面不好。比较值和/或解决方案等操作通常只需要几个处理器周期,现代CPU可以轻松处理。这意味着您的解决方案很好,并且不需要更改。

另一种可能性是将值乘以并检查结果是否等于0,但这种方法可能要慢很多,因为乘法通常比比较值和/或它们需要更多的处理器周期。

答案 2 :(得分:3)

此:

if((IND_1,IND_2,IND_3)==0)

在括号内使用C逗号运算符,它将:

  • 评估IND_1IND_2,将结果抛弃
  • 评估IND_3,并将其作为(子)表达式
  • 的结果生成

然后将该结果与0进行比较,它可能会或可能不会相等。但是,这种比较的结果取决于{em>仅 IND_3的值,所以这根本不是你想要做的。

除非您已对此进行了描述,以便知道 OR的大链占用太多时间,否则请将其留下。

否则,您可以重新对比较进行排序,因为它会在找到第一个true值时停止,或者将它们打包成注释中建议的整数。

答案 3 :(得分:2)

我不会更改代码 - 除了添加换行符,如:

if (IND_1 == 0 ||
    IND_2 == 0 ||
    ....
    IND_N == 0)

使用== 0||编写代码的方式使得阅读和理解您想要实现的内容变得非常容易。这很有价值。

使用&&并省略== 0只会让代码更难阅读。编译器不应该关心,因此在遗漏== 0时不应该有任何好处。

所以我的意思是:保留当前的代码。

你应该改变一些东西的唯一原因是,如果一个变量比其他变量更可能为零。在这种情况下,您应该首先放置“最有可能为零”的变量。

关于这部分:

if((IND_1||IND_2||IND_3||IND_4||IND_5||IND_6||IND_7||IND_8||IND_9) == 0 ) 
   printf("Apple");

你已经写过它没用了。原因是它不等同于您的原始代码。相反,它相当于:

if((IND_1 == 0 && IND_2==0 && .... && IND_N==0) == 0 ) 
    printf("Apple");

所以你的重写实际上破坏了逻辑!

这只是强调你应该避免使用“智能”技巧,只需以易于阅读和理解的自然方式编写代码。

答案 4 :(得分:1)

使用正确的逻辑时,可以减少写入的数量:

if((IND_1&&IND_2&&IND_3&&IND_4&&IND_5&&IND_6&&IND_7&&IND_8&&IND_9) == 0 ) 
  printf("Apple");

这不是那么好读。酒吧“|”看起来更像一张桌子。逻辑AND运算符&&不会改善这一点。所以你可以试试这个:

if((IND_1 && IND_2 && IND_3 && IND_4 && IND_5 &&
    IND_6 && IND_7 && IND_8 && IND_9) == 0 ) 
  printf("Apple");

但这不会影响性能。在任何情况下,CPU将在第一个IND_x为零后停止计算表达式。