我无法理解逻辑运算符在C中是如何工作的。我已经理解了位级运算符的工作原理,并且我也知道逻辑运算符将非零参数视为表示TRUE,将零参数视为FALSE
但是说我们有0x65&& 0x55的。我不明白为什么以及如何操作给出0x01。
我试图将其转换为二进制文件,但我无法弄清楚它是如何工作的
答案 0 :(得分:2)
&&
运营商:
如果左操作数和右操作数都不同于0
,则评估为1
,否则评估为0
。
如果左操作数为0
,则不评估右操作数,结果为0
。
0x65 && 0x55
评估为1
。
答案 1 :(得分:1)
&&
是逻辑AND
(与&
相对,后者是按位 AND
)。它只关心它的操作数为零/非零值。零被视为false
,而非零被视为true
。
在您的情况下,两个操作数都不为零,因此它们被视为true
,结果也是true
。 C代表true
为1
,解释了您的操作的整体结果。
如果将操作更改为&
,则会进行按位操作。 0x65 & 0x55
将为您提供0x45
。
答案 2 :(得分:0)
&&
是逻辑运算符,而不是按位运算符。 0x65和0x55都为真,因此结果为真数。 0x01是一个真实的数字。
二进制表示仅适用于按位运算。表达式0x65 & 0x55
等于0x45
。
答案 3 :(得分:0)
任何计算结果为0的表达式都是false。任何非零的表达式都是正确的。所以0x65和0x55都是真的。
0x65&& 0x55的
=>真实&&真正 =>真
答案 4 :(得分:0)
我尝试将其转换为二进制
这可能妨碍了解。 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:
给定的实现可能能够比这更有效地发出代码(尽管我已经看到几乎发出的代码,每个if ... goto
都是程序集中的测试和分支)。效率更高的代码可能涉及一些位操作以避免分支。就此而言,在这个涉及常量的示例中,编译器可能只会发出a = 1;
。
&&
运算符的含义就条件执行而言。例如,如果您编写f() && g()
,则可以保证当f
返回false值时,不会调用g
。如果有可能通过点缀来获得相同的结果,那么这可能是表现的奖励。
答案 5 :(得分:0)
C和C ++有三个logical operators:逻辑非(!
),逻辑和(&&
)和逻辑或(||
)。对于逻辑运算符,0
为false且anything that is not zero is true。这个truth table说明了每个逻辑运算符的工作原理(将1
用于true
):
p q p && q p || 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
,因此整个表达式的计算结果为true
,因此expands to 1
适用于c99
但是链接线程中的其他答案也解释了它在c99
之前是如何应用的。
答案 6 :(得分:-1)
C将大于零的值定义为“True”。由于0x65和0x55都匹配这个条件,结果也是True - 在输出时为1 - 或者,以十六进制表示,0x01。
代码的另一种写作方式是:
返回(0x65为真)和(0x55为真);
答案 7 :(得分:-1)
正如您所说,逻辑运算符将非零参数视为
(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