所以我们在测试中得到了这段代码,我对它的含义和工作原理一无所知。
unsigned int a = 1, b = 2, c;
进而c = a&b || a&&b;
问题是: 的价值是多少c
。答案是 1。
有人可以解释初始化中发生了c
什么吗?
所以我们在测试中得到了这段代码,我对它的含义和工作原理一无所知。
unsigned int a = 1, b = 2, c;
进而c = a&b || a&&b;
问题是: 的价值是多少c
。答案是 1。
有人可以解释初始化中发生了c
什么吗?
unsigned int
变量a
并持有一些代表 1 和 2的b
位模式。不会是这样,但为了描述起见,让我们说
a = 0b0001
b = 0b0010
那将是 4 位整数中的数字 1 和 2。
&
运算符按位执行,因此您逐位计算(0,0)->0
、(0,1)->0
和。所以,对于上面的两个整数(1,0)->0
(1,1)
a = 0b0001
b = 0b0010
a&b = 0b0000
我们看到它a&b
为零,因为它们没有任何重叠的 1 位。
运算符&&
执行逻辑与,这意味着如果两个参数都不为零,则结果为 1,否则结果为零。所以a && b = 1
因为两者都不a
是b
零。
a = 0b0001
b = 0b0010
a&&b = 0b0001
||
运算符是逻辑或;如果任何参数非零,它会给你 1,如果两个参数都为零,它会给你 1。所以,既然
a&b = 0b0000
a&&b = 0b0001
哪里a&&b
是非零,你得到c = (a&b) || (a&&b) = 1
。
这个赋值语句
c = a&b || a&&b;
为了清楚起见,可以用以下方式重写
c = ( a&b ) || ( a&&b );
a & b
是按位与运算。Asa
等于1
和b
等于2
那么运算的结果等于0
(为简单起见,我在数字表示中仅使用 8 位)
00000001
&
00000010
========
00000000
来自 C 标准(6.5.10 位与运算符)
4 二元 & 运算符的结果是操作数的按位与(即,当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置)。
在这个表达式a && b
中有逻辑与运算。1
当两个操作数不等于 时,它等于0
。asa
和b
不等于0
then 运算的结果是1
。
来自 C 标准(6.5.13 逻辑与运算符)
3 如果 && 运算符的两个操作数比较不等于 0,则 && 运算符将产生 1;否则,它产生 0。结果具有 int 类型。
所以你有了
c = 0 || 1;
使用逻辑或运算的地方。1
如果至少有一个操作数不等于 ,则产生0
。
来自 C 标准(6.5.14 逻辑或运算符)
3 || 如果任一操作数比较不等于 0,则运算符应产生 1;否则,它产生 0。结果具有 int 类型。
所以变量c
将被赋值1
。
我将从另一个角度解释它。
a&b
仅当两者都在同一位置设置了至少一个位时才会给出非零
a&&b
1
只有当两者都不为零时才会给出
a&b || a&&b
只有当两者都不为零并且至少有一位设置在同一位置时,才会给出一。
它可以简化为:
int c = a&&b;