2016-09-30 110 views
0

我要评估在C以下布尔表达式:如何评估C中的布尔表达式?

f = (b+c')(a'+c')(a+b'+c) 

这是我的当前程序:

#include <stdio.h> 
int main() 
{ 
    int a,b,c,f; 
    a=0;b=1;c=1; 
    f=((b|(~c))&((~a)|(~c))&(a|(~b)|c)); 
    printf("%d\n",f); 
} 

该函数应返回1,因为A = 0,B = 1和c = 1但它返回-1。 而且,当a = 1,B = 1和c = 1它返回-2而不是0

为什么发生这种情况?我该如何解决它?

+1

*布尔*用C语义是通过运营商提供的'!','||'和''&&。运算符'〜',''''和'&'实现*按位*语义,这是完全不同的事情。 – AnT

+1

请注意,C也有一个布尔类型,如果你想明确地说明你正在处理布尔类型,你不必使用* int *。 – hyde

回答

6

在C语言中使用!的否定:

#include <stdio.h> 
int main() 
{ 
    int a,b,c,f; 
    a=0;b=1;c=1; 
    f=((b||(!c))&&((!a)||(!c))&&(a||(!b)||c)); 
    printf("%d\n",f); 
} 

~运营商所有翻转一些数字中的位,这不是你想要的,以及你为什么得到-1。

此外,您还需要||而不是|&&而不是&。该&|运营商在各个位,其中为||&&是逻辑运算符和你想要做什么工作。

+0

谢谢,但是有什么方法可以通过按位运算符获得我所需的输出吗? – WhiteFlameAB

+1

@WhiteFlameAB是的,要使它工作,使用'f&1'。 – kamoroso94

+0

@ kamoroso94'F&1 =((B |(〜C))&((〜A)|(〜c)中)及(A |(〜B)| C));'喜欢这个? – WhiteFlameAB

4

这是因为您使用的是所谓的位运算符,它们分别在数字的每个位上起作用。

因此,假设int为32位,你有:

a = 00000000000000000000000000000000 
b = 00000000000000000000000000000001 
c = 00000000000000000000000000000001 
~c = 11111111111111111111111111111110 
b|~c = 11111111111111111111111111111111 

等。

如果使用逻辑运算符&&||!代替,则每个号码将被视为单个“位”(0,如果它是0,或1,如果它不是0)。

或者,你可以在末尾添加& 1,以确保所有的位,除了最后一个为0

+0

谢谢!你能否详细说明你的意思在最后加入&1? – WhiteFlameAB