-3

所以我们在测试中得到了这段代码,我对它的含义和工作原理一无所知。 unsigned int a = 1, b = 2, c; 进而c = a&b || a&&b;

问题是: 的价值是多少c。答案是 1。

有人可以解释初始化中发生了c什么吗?

4

3 回答 3

1

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因为两者都不ab零。

     a = 0b0001
     b = 0b0010
  a&&b = 0b0001

||运算符是逻辑或;如果任何参数非零,它会给你 1,如果两个参数都为零,它会给你 1。所以,既然

  a&b = 0b0000
 a&&b = 0b0001

哪里a&&b是非零,你得到c = (a&b) || (a&&b) = 1

于 2021-11-19T10:56:40.657 回答
0

这个赋值语句

c = a&b || a&&b;

为了清楚起见,可以用以下方式重写

c = ( a&b ) || ( a&&b );

a & b是按位与运算。Asa等于1b等于2那么运算的结果等于0(为简单起见,我在数字表示中仅使用 8 位)

00000001
&
00000010
========
00000000

来自 C 标准(6.5.10 位与运算符)

4 二元 & 运算符的结果是操作数的按位与(即,当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置)。

在这个表达式a && b中有逻辑与运算。1当两个操作数不等于 时,它等于0。asab不等于0then 运算的结果是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

于 2021-11-19T10:53:49.037 回答
0

我将从另一个角度解释它。

a&b仅当两者都在同一位置设置了至少一个位时才会给出非零

a&&b1只有当两者都不为零时才会给出

a&b || a&&b只有当两者都不为零并且至少有一位设置在同一位置时,才会给出一。

它可以简化为:

int c = a&&b;

于 2021-11-19T11:19:02.480 回答