【问题标题】:Compoud operator (+=) and && in C, weird valueC 中的复合运算符 (+=) 和 &&,奇怪的值
【发布时间】:2021-05-11 07:45:09
【问题描述】:

看这段代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
  int a = -1;
  int b = 0xfc; // = 252
  b+=a && a++;
  printf("%d %d\n", a, b);
}

我认为的输出应该是:

0 251

其实真正的输出是:

0 253

但是为什么呢? && 的结合性是从左到右的,所以

  1. b = b - 1(a)(b 应该是 251)
  2. 左边部分为真,所以:a++ (a = 0)

我的假设有问题,谁能给我解释一下?

如果可以帮助 gdb 的输出(带有对 a 和 b 的观察点):

Old value = 0
New value = -1
main () at test.c:7
7         int b = 0xfc;
(gdb) c
Continuing.

Hardware watchpoint 2: b

Old value = 0
New value = 252
main () at test.c:8
8         b+=a && a++;
(gdb) c
Continuing.

Hardware watchpoint 3: a

Old value = -1
New value = 0
0x0000555555555172 in main () at test.c:8
8         b+=a && a++;
(gdb) c
Continuing.

Hardware watchpoint 2: b

Old value = 252
New value = 253
main () at test.c:9
9         printf("%d %d\n", a, b);

【问题讨论】:

  • 为什么要在运算符优先级上浪费时间,而不是编写只能以一种方式解释的清晰代码?
  • &amp;&amp; 的优先级高于 +=
  • but in C a &amp;&amp; whatever is equal to 1 - 不 - 它等于 10 取决于 awhatever

标签: c output compound-assignment


【解决方案1】:

解释很简单。

a &amp;&amp; a++ 是一个逻辑运算,其结果可以是01。由于a 不为零,并且任何非零值都被视为true,因此此操作的结果为1

这个值被添加到252。显示的结果是253

【讨论】:

  • so 和b+= (a &amp;&amp; a++); 一样,因为a &amp;&amp; a++ 是1,所以加了1,对吧?
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 2023-04-03
  • 2013-11-14
  • 2012-01-22
  • 1970-01-01
  • 2012-02-07
  • 2020-07-30
  • 1970-01-01
相关资源
最近更新 更多