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 而在另一种情况下返回 false。
最佳答案
&
是按位与和&&
是逻辑和。
表达式x && y
将返回 1
如果两个x
和 y
是非零的,并且 0
否则。请注意,如果 x
为零,则 y
根本不会评价。如果y
,这将很重要是一个有副作用的表达式。这种行为称为短路。
表达式x & y
将对 x
中的每个单独位执行按位运算和 y
.所以如果x
是1010
二进制和y
是1100
然后x & y
将评估为 1000
.注意 x & y
的返回值不应被解释为 bool 值,即使可能。在早期的 C 中,运算符 &&
不存在,因此&
用于此目的。
解释它的一种方法是,您可以想象 &
与应用 &&
是一样的在操作数中的每个单独的位上。
另请注意 &
优先级低于 &&
,尽管直觉告诉我们应该反过来。这也适用于比较运算符,例如 <
, <=
, ==
, !=
, >=
, >
.这可以追溯到 C 没有运算符 &&
的时候和 ||
并且使用了按位版本。这个时候是有道理的,但是加上了逻辑运算符就没有了。 Kernighan 和 Ritchie 承认这会更有意义,但他们没有修复它,因为这会破坏现有代码。
I'm not sure why this would return true in one scenario and false in another.
x & y
的返回值根本不应该被视为 bool 值。但是,它可以(取决于代码的编写方式)被视为 bool 数组。如果你有两个整数,flags1
和 flags2
然后是 flags1 & flags2
的结果将表示在两者 flags1
中切换的标志和 flags2
.
关于c - C语言中&和&&的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49617159/