逻辑运算符

Logical operators

我找到了一个答案,但我似乎无法弄清楚为什么它是正确的。

所以有两个int变量x和y,分别代表0x66和0x39。

题目问的是根据表达式的结果值是多少。

x && y is apparently 0x01 (1)
x || y is 1
!x || !y is 0
x && ~y is 1

根据我的想法,我认为只要参数不为零,它就被认为是正确的。所以只要 x 和 y 是某个非零值,那么 && 运算符就会产生 1,当然只要其中之一为真,||运算符会产生 1。

那么为什么第三题是0呢?是个 !与按位 ~ 运算符不同?所以最初 x 是二进制的 0101 0101 因为它不是零所以它在逻辑意义上是正确的,但是!它将是错误的,或者它会做数字的补充,所以它的 1010 1010?

布尔结果总是真或假,在 C 中,真由 1 表示,假由 0 表示。

逻辑非运算符 ! 给出布尔结果,即 10。因此,如果表达式为 "true"(即非零),则在该表达式上应用 ! 将使它为假,即 0.

在您的示例中,您有 !x || !y。首先 !x 被评估,它评估为 false,导致 !y 被评估,它也评估为 false,因此 while 表达式变为 false,即 0.

是的,! 不同于按位非 ~。这是合乎逻辑的。它产生 0 或 1。

~(0x01) 将 0x10 和 !(0x01) 将 0x00

'~'是位运算符。 '!'是逻辑运算符。

From what I was thinking, I thought as long as an argument was not zero it was considered true. So as long as x and y were some non-zero value then && operator would produce a 1, and of course as long as one of them is true the || operator would produce a 1.

这都是正确的。

So why is the third question 0? Is the ! different from the bitwise ~ operator?

是的。这是合乎逻辑的 NOT。就像其他逻辑运算符 &&|| 一样,它只关心变量是否具有非零值。

!0 将产生 1.

!non_zero 将产生 0.


请注意,C 中的所有逻辑运算符都会产生类型 int 而不是 bool,因为丑陋的向后兼容性从 C 拥有布尔类型之前就一直存在。在 C++ 和其他类 C 语言中,逻辑运算符总是产生类型 bool.

类似地,C中的truefalse实际上只是扩展为整数10的宏。在其他语言中,它们是关键字和布尔常量。