Akiyu
2019-01-28 08:37:52 +08:00
我试了一下汇编, 看了看结果
这是测试用的 c++ 代码:
--------------------
int i = 1, i2 = 10;
printf("%d\n", i & i2);
printf("%d\n", i && i2);
--------------------
编译选项为 g++ -std=c++0x -S t.cpp, 编译器版本 4.4.7
以下是汇编代码
--------------------
subq $16, %rsp
movl $1, -8(%rbp)
movl $10, -4(%rbp)
movl -4(%rbp), %eax
movl -8(%rbp), %edx
andl %edx, %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
cmpl $0, -8(%rbp)
je .L2
cmpl $0, -4(%rbp)
je .L2
movl $1, %eax
jmp .L3
.L2:
movl $0, %eax
.L3:
movzbl %al, %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
--------------------
&& 是将 i 和 i2 都与 0 做对比,
一旦结果相同(je), 直接跳转 .L2 赋值为 0, 否则默认赋值为 1, 然后跳转 .L3
所以你这样认为, && 只是语言对汇编做的封装, 对于编译器来说, 没有这个操作
(当然, 这个例子不怎么好, dalao 轻点喷我)