C中的逻辑运算符

时间:2012-09-08 16:09:43

标签: c logical-operators

我无法理解逻辑运算符在C中是如何工作的。我已经理解了位级运算符的工作原理,并且我也知道逻辑运算符将非零参数视为表示TRUE,将零参数视为FALSE

但是说我们有0x65&& 0x55的。我不明白为什么以及如何操作给出0x01。

我试图将其转换为二进制文件,但我无法弄清楚它是如何工作的

8 个答案:

答案 0 :(得分:2)

&&运营商:

如果左操作数和右操作数都不同于0,则评估为1,否则评估为0

如果左操作数为0,则不评估右操作数,结果为0

0x65 && 0x55评估为1

答案 1 :(得分:1)

&&是逻辑AND(与&相对,后者是按位 AND)。它只关心它的操作数为零/非零值。零被视为false,而非零被视为true

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

如果将操作更改为&,则会进行按位操作。 0x65 & 0x55将为您提供0x45

的结果

答案 2 :(得分:0)

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

二进制表示仅适用于按位运算。表达式0x65 & 0x55等于0x45

答案 3 :(得分:0)

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

0x65&& 0x55的

=>真实&&真正 =>真

答案 4 :(得分:0)

  

我尝试将其转换为二进制

这可能妨碍了解。 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:

给定的实现可能能够比这更有效地发出代码(尽管我已经看到几乎发出的代码,每个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

由于两个操作数0x650x55都评估为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