之间及与&&用C的区别?

问题描述 投票:2回答:3

什么是用C &&&之间的区别?

我的老师给我这个例子:

int a = 8;
int b = 4;
printf("a & b = %d\n", a & b);
printf("a && b = %d\n", a && b);

输出:

a & b = 0;
a && b = 1;

我不知道为什么会在一个场景中返回true,而在另一个假的。

c bitwise-operators logical-operators
3个回答
8
投票

&是按位与和&&是逻辑和。

表达x && y将返回1如果两个xy不为零,否则0。请注意,如果x为零,那么y将无法在所有的评估。

x & yxy上每个单独的位执行逐位操作的表达。所以,如果x1010二进制和y1100然后x & y将评估为1000。需要注意的是x & y的返回值不应该被解释为一个布尔值。

解释是,你可以想像,&一种方式是同样的事情,在操作数每个单独应用位&&

还要注意的是&&&优先级低,即使直觉说,这应该是周围的其他方法。这还要比较运营商,像<<===!=>=>。这又回到了当时当C没有运营商&&||并代替按位版本。在这个时候,它是有道理的,但是当加入逻辑运算符,它没有了。 Kernighan和Ritchie承认,它会更有意义,但他们并没有解决这个问题,因为这会破坏现有的代码。

我不知道为什么会在一个场景中返回true,而在另一个假的。

x & y返回值不应该被作为一个布尔值,在所有接受治疗。但是,它可以(取决于代码是如何写的)被视为一个布尔矩阵。如果有两个整数,flags1flags2然后flags1 & flags2的结果将表示可在两个flags1flags2触发该标志。


2
投票

&&(逻辑和操作员) - 左侧和右侧的操作数是boolean表达式。如果两个操作数不为零,则条件为真。

>

&(按位与运算符) - 左侧和右侧的操作数是integral类型。二进制和运营商的副本,如果它存在于两个操作数了一下结果。

在老师的例子a && b,左操作4和右操作数8都是非为零。所以病情会成为现实。

在老师的其他例子a & b,左操作数40100和正确的操作801000副本没有位结果。这是因为在任何一个操作数没有共同的位。


1
投票

所述&运算符执行一个位方式和操作它的整数操作数,产生一个整数结果。因此(8 & 4)(0b00001000 bitand 0b00000100)(使用不标准C存在,为了清楚的二进制符号),这导致0b000000000

所述&&操作者执行在其操作数的布尔逻辑与运算,产生一个布尔结果。因此(8 && 4)相当于((8 != 0) and (4 != 0)),或(true and true),这导致true

© www.soinside.com 2019 - 2024. All rights reserved.