如何评估C中的布尔表达式?

时间:2016-09-30 04:24:17

标签: c function boolean boolean-expression

我想在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。

为什么会这样?我该如何解决?

2 个答案:

答案 0 :(得分: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。

您还需要||而不是|&&而不是&&|运算符处理各个位,其中||&&是逻辑运算符,可以执行您想要的操作。

答案 1 :(得分:4)

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

所以假设int是32位,你有:

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

等等。

如果您使用逻辑运算符 &&||!,则每个数字将被视为单个“位”(如果它是0,如果它不是0则为1。

或者,您可以在末尾添加& 1以确保除最后一位之外的所有位都为0.