2016-09-30 3 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, так как а = 0, Ь = 1 и с = 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

Смежные вопросы