逻辑运算符在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
我试图将其转换为二进制
这可能妨碍了理解。 0x65
和0x55
的确切位模式与所需结果完全无关,重要的是它们都是非零的。 你可以考虑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
由于操作数0x65
和0x55
计算结果均为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