这个操作是什么意思
What is the meaning of this operation
所以我们在测试中得到了这段代码,我对它的含义和工作原理一无所知。
unsigned int a = 1, b = 2, c;
然后 c = a&b || a&&b;
问题是:c
的值是多少。答案是 1。
有人可以解释一下 c
的初始化过程吗?
这个赋值语句
c = a&b || a&&b;
为了清楚起见,可以按以下方式重写
c = ( a&b ) || ( a&&b );
a & b
是按位与运算。由于 a
等于 1
而 b
等于 2
那么运算结果等于 0
(我只使用了 8 位为简单起见,数字表示)
00000001
&
00000010
========
00000000
来自 C 标准(6.5.10 按位与运算符)
4 The result of the binary & operator is the bitwise AND of the
operands (that is, each bit in the result is set if and only if each
of the corresponding bits in the converted operands is set).
在这个表达式a && b
中有一个逻辑与操作。当两个操作数都不等于 0
时,它等于 1
。由于 a
和 b
不等于 0
那么操作的结果是 1
.
来自 C 标准(6.5.13 逻辑与运算符)
3 The && operator shall yield 1 if both of its operands compare
unequal to 0; otherwise, it yields 0. The result has type int.
所以你有
c = 0 || 1;
使用逻辑或运算的地方。如果至少一个操作数不等于 0
.
,它会产生 1
来自 C 标准(6.5.14 逻辑或运算符)
3 The || operator shall yield 1 if either of its operands compare
unequal to 0; otherwise, it yields 0. The result has type int.
所以变量c
将被赋值为1
。
unsigned int
变量 a
和 b
保存一些表示 1 和 2 的位模式。它不会是这个,但为了描述的缘故,让我们说
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,如果两个参数都为零,它只会给你零。所以,因为
a&b = 0b0000
a&&b = 0b0001
其中 a&&b
非零,您得到 c = (a&b) || (a&&b) = 1
。
我换个角度解释一下
a&b
仅当两者都在同一位置设置了至少一位时才会给出非零
a&&b
仅当两者都不为零时才会给出 1
a&b || a&&b
只有当两者都不为零并且在同一位置至少设置了一位时,才会给出一个。
可以简化为:
int c = a&&b;
所以我们在测试中得到了这段代码,我对它的含义和工作原理一无所知。
unsigned int a = 1, b = 2, c;
然后 c = a&b || a&&b;
问题是:c
的值是多少。答案是 1。
有人可以解释一下 c
的初始化过程吗?
这个赋值语句
c = a&b || a&&b;
为了清楚起见,可以按以下方式重写
c = ( a&b ) || ( a&&b );
a & b
是按位与运算。由于 a
等于 1
而 b
等于 2
那么运算结果等于 0
(我只使用了 8 位为简单起见,数字表示)
00000001
&
00000010
========
00000000
来自 C 标准(6.5.10 按位与运算符)
4 The result of the binary & operator is the bitwise AND of the operands (that is, each bit in the result is set if and only if each of the corresponding bits in the converted operands is set).
在这个表达式a && b
中有一个逻辑与操作。当两个操作数都不等于 0
时,它等于 1
。由于 a
和 b
不等于 0
那么操作的结果是 1
.
来自 C 标准(6.5.13 逻辑与运算符)
3 The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.
所以你有
c = 0 || 1;
使用逻辑或运算的地方。如果至少一个操作数不等于 0
.
1
来自 C 标准(6.5.14 逻辑或运算符)
3 The || operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has type int.
所以变量c
将被赋值为1
。
unsigned int
变量 a
和 b
保存一些表示 1 和 2 的位模式。它不会是这个,但为了描述的缘故,让我们说
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,如果两个参数都为零,它只会给你零。所以,因为
a&b = 0b0000
a&&b = 0b0001
其中 a&&b
非零,您得到 c = (a&b) || (a&&b) = 1
。
我换个角度解释一下
a&b
仅当两者都在同一位置设置了至少一位时才会给出非零
a&&b
仅当两者都不为零时才会给出 1
a&b || a&&b
只有当两者都不为零并且在同一位置至少设置了一位时,才会给出一个。
可以简化为:
int c = a&&b;