C 中的复合运算符 (+=) 和 &&,奇怪的值
Compoud operator (+=) and && in C, weird value
查看这段代码:
#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
但是为什么呢? && 的结合性是从左到右,所以
- b = b - 1(a)(b 应该是 251)
- 左边部分为真所以: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);
解释的很简单
a && a++
是逻辑运算,其结果可以是0
或1
。由于 a
不为零,任何非零值都被视为 true
,因此此操作的结果为 1
.
此值添加到 252
。显示的结果是253
.
查看这段代码:
#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
但是为什么呢? && 的结合性是从左到右,所以
- b = b - 1(a)(b 应该是 251)
- 左边部分为真所以: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);
解释的很简单
a && a++
是逻辑运算,其结果可以是0
或1
。由于 a
不为零,任何非零值都被视为 true
,因此此操作的结果为 1
.
此值添加到 252
。显示的结果是253
.