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

How to evaluate a boolean expression in 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);
}

函数应该 return 1 因为 a=0,b=1 和 c=1 但它 returns -1。 此外,当 a=1、b=1 和 c=1 时,它 returns -2 而不是 0.

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

这是因为您使用的是所谓的按位运算符,它们分别处理数字的每一位。

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

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

等等。

如果您使用 逻辑运算符 &&||!,则每个数字将被视为单个 "bit"(如果为 0 则为 0,如果不为 0 则为 1)。

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

在 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 的原因。

您还需要 || 而不是 |&& 而不是 &&| 运算符作用于单个位,而 ||&& 是逻辑运算符,可以做你想做的事。