按位OR与逻辑OR

时间:2015-11-27 04:57:05

标签: c bitwise-operators logical-operators

C中的

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。

8 个答案:

答案 0 :(得分:3)

1)否1 | 23(您可以通过将其打印出来进行测试),因此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] !=1d[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是检查的最终值。