我有以下代码:
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次不同的变量,所以想到它。还要记住程序处理能耗。
答案 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_1
和IND_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为零后停止计算表达式。