是
if((d[i] != 1) && (d[i] != 2))
与
相同if(d[i] != (1 | 2))
为什么
if(d[i] != (1 || 2))
被编译器拒绝了?
有没有办法简化第一个语句,如果我想检查许多常量?要检查d [i]是否为1,2,3,4,5。如果d [i]是例如,我会拒绝它6。
答案 0 :(得分:3)
1)否1 | 2
为3
(您可以通过将其打印出来进行测试),因此if(d[i] != (1 | 2))
与if(d[i] != 3)
做同样的事情
2)不应该。 1 || 2
应该是1
,因此if(d[i] != (1 || 2))
应该与if(d[i] != 1)
做同样的事情。如果你得到一个错误,那么我怀疑那是因为你正在使用编译器的“将警告视为错误”选项(-Werror
用于gcc或clang)。
答案 1 :(得分:1)
不,他们不一样。 if((d[i] != 1) && (d[i] != 2))
不能进一步简化。
让我们来看看其他代码。 if(d[i] != (1 | 2))
它首先执行(1|2)
,结果为3
。然后执行比较if(d[i] != 3)
,你当然不想要那个,对吧?
现在在if(d[i] != (1 || 2))
中,首先完成的操作是(1 || 2)
,它导致true
(类型为布尔值),并且由于类型不匹配编译器,您的语句实际上变为if(d[i] != true) //comparing int to boolean
< em>警告反对它。
如果要检查多个数字,请使用for循环和数组作为
int constants[]= {1,2,3,4,5}; //constants to check against
int ar_size = sizeof(constants) / sizeof(constants[0]); //ar_size will adjust to array size, you can use vector for simplification
bool inArray = false; //default is false.
for (int it_i = 0; i < ar_size; it_i++)
{
if (constants[it_i] == d[i]) //Checking is done here
inArray = true;
}
//just use inArray to find if element was in constants[] or not
if (inArray)
{
//code
}
答案 2 :(得分:0)
更新回答
如果我想检查,有没有办法简化第一个语句 很多常数?要检查d [i]是否为1,2,3,4,5。所以我 如果d [i]是例如,则拒绝它6。
绝对:
if ((d[i] >= 1) && (d[i] <= 5))
看,它真的没那么复杂。编译器可能会优化这一点。
对于它的价值,检测x in [1..5]
实际上是用位掩码逻辑优化的非常困难的表达式。如果您为整数范围的低三位写出卡诺图,则不会显示任何有用的信息。最好的我可以简化它:
if (4 >= (unsigned)(d[i]-1))
我在Visual Studio中编译了一些代码,以了解它如何在零售版本中优化(x >= 1) && (x <= 5)
。它完全像上面的表达式一样优化。那就是:((x-1) < 4)
答案 3 :(得分:0)
在8位数字中,1
表示为:
0000 0001
2
表示为
0000 0010
这两个数字的按位OR导致
0000 0011
是3
。
因此,
d[i] != (1 | 2)
与d[i] != 3
相同。这显然与(d[i] != 1) && (d[i] != 2)
非常不同。
if(d[i] != (1 || 2))
不应该被编译器拒绝。该陈述相当于:
if(d[i] != 1)
答案 4 :(得分:0)
条件1。
if((d[i] != 1) && (d[i] != 2))
这将检查条件d[i] !=1
和d[i]!=2
,如果d [i]不等于1,则运行2条件。
如果第一个条件失败,则不会检查d [i]!= 2.
条件2。
if(d[i] != (1 | 2))
这里(1 | 2)将返回3.
1==> 0001
2==> 0010
------
Bitwise OR= 0011 ==> result will be 3
表示会检查d[i] !=3
条件3。
if(d[i] != (1 || 2))
1 || 2将返回TRUE,因此它会给你错误。
因为d [i]具有整数值,并且您尝试将其与布尔值进行比较,这会导致错误。
答案 5 :(得分:0)
要针对多个值检查变量,必须每次都在a == 1 || a == 2 || ...
或a != 1 && a != 2 && ...
中指定变量。
仅指定a != (1 || 2 ||..)
中的常量不会产生预期结果,因为1 || 2
已扩展为1(请参阅Short circuit evaluation)。编译器可能会发出警告,因为它看起来像是一个不太可能的(非预期的)构造。
答案 6 :(得分:0)
d [i] 是整数值,(1 || 2)的结果是布尔 true 。 if(d [i]!=(1 || 2))中布尔值和积分值的比较对编译器没有意义。
答案 7 :(得分:0)
在C if((d[i] != 1) && (d[i] != 2))
中暗示当且仅当d [i]不等于1且d [i]等于2时才满足此条件(两个条件必须同时满足)。
与if(d[i] != (1 | 2))
不同,因为这意味着当且仅当d [i]不等于1和2的按位OR(0001 | 0010 = 0011(3))时,该条件为真。所以间接地检查d [i]是否不等于3。
if(d[i] != (1 || 2))
不会拒绝 gcc <filename.c>
并执行a.out
文件。这将检查d [i]的异或为1和2是1.如果d [i]不等于1,则间接地将此条件评估。
通过此检查,您可以轻松评估您的最终问题:
if((d[i]>=1) && (d[i]<=5))
其中1是初始值,5是检查的最终值。