逻辑运算符在C中

我很难理解逻辑运算符是如何在C中工作的。我已经理解位级操作符是如何工作的,而且我也知道逻辑运算符将非零参数视为表示TRUE和零参数,表示为FALSE

但是说我们有0x65 && 0x55。 我不明白为什么和如何这个操作给0x01。

我试图将其转换为二进制,但我不明白它是如何工作的

&&是一个逻辑AND (与&相反,这是一个按位 AND )。 它只关心其操作数为零/非零值。 零被认为是false ,而非零被视为是true

在你的情况下,两个操作数都是非零的,因此它们被视为是true ,结果也是true 。 C代表true 1 ,解释您的操作的整体结果。

如果将操作更改为& ,则会执行按位操作。 0x65 & 0x55会给你0x45的结果。

&&运营商:

如果左边的操作数和右边的操作数都不是0则它的计算结果为1否则计算结果为0

如果左操作数为0 ,则不计算右操作数,结果为0

0x65 && 0x55被评估为1

&&是一个逻辑运算符,不是一个按位运算符。 0x65和0x55都是真的,所以结果是一个真实的数字。 0x01是一个真实的数字。

二进制表示仅用于按位操作。 expression式0x65 & 0x55等于0x45

任何计算结果为0的expression式都是false。 任何非零expression式都是正确的。 所以0x65和0x55都是真的。

0x65 && 0x55

=> true && true => true

我试图将其转换为二进制

这可能妨碍了理解。 0x650x55的确切位模式与所需结果完全无关,重要的是它们都是非零的。 你可以考虑a = (0x65 && 0x55)相当于类似于:

 if (0x65 != 0) goto condition_false; if (0x55 != 0) goto condition_false; a = 1; goto condition_end; condition_false: a = 0; condition_end: 

一个给定的实现可能能够发出比这更高效的代码(尽pipe我已经看到了非常多的代码,每个if ... goto在程序集中都是一个testing和分支)。 更高效的代码可能涉及一些操作以避免分支。 对于这个问题,在这个涉及常量的例子中,编译器可能只是发出a = 1;

不过, &&运算符的含义是以条件执行为条件的。 例如,如果你写了f() && g()那么它保证当f返回一个假值时, g不被调用。 如果有可能通过点击获得相同的结果,那么这可能是性能的奖励。

C和C ++有三个逻辑运算符 :逻辑不( ! ),逻辑和( && )和逻辑或( || )。 对于逻辑运算符, 0是错误的,而不是零的东西是真的 。 这个真值表说明了每个逻辑运算符是如何工作的(将使用1作为true ):

 pqp && qp || q = = ====== ====== 1 1 1 1 1 0 0 1 0 1 0 1 0 0 0 0 

真相表! 如下:

 p !p = === 1 0 0 1 

对于您的具体情况:

 0x65 && 0x55 

由于操作数0x650x55计算结果均为true ,因此整个expression式的计算结果为true ,因此扩展为1 ,这适用于c99但链接线程中的其他答案也解释了它在c99之前的应用。

C定义大于零的值为“真”。 因为0x65和0x55都符合这个条件,所以结果也是真的 – 在输出上,它是1 – 或者hex符号0x01。

您的代码的另一种写法是:

返回(0x65为true)和(0x55为true);

正如你所说,逻辑运算符把非零参数当作表示

  (0x65 && 0x55) is equal as (0x65 > 0) && (0x55 > 0) 0x65 > 0 get true and 0x55 > 0 get true as well So (0x65 && 0x55) is equal true && true = 1