2016-09-30 85 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