在C标准中,有这样的规定:
在“exp1 && exp2” 中如果exp1为false,则不再计算exp2的值
在“exp1 ¦ ¦ exp2” 中如果exp1为true,则不再计算exp2的值
这种机制被称为”逻辑短路“,一是为了优化,更重要的是为了提高代码的可移植性,避免产生二义性
但并不是所有的实现都支持这种机制
比如如下的C代码:
view plaincopy to clipboardprint?
void cond(int a, int *p)
{
if (p && a > 0)
*p += a;
}
void cond(int a, int *p)
{
if (p && a > 0)
*p += a;
}
命名为cond.c, 用如下命令编译成汇编语言文件:
gcc -O2 -S cond.c
得到如下的.s文件:
view plaincopy to clipboardprint?
.file "cond.c"
.text
.p2align 4,,15
globl _cond
.def _cond; .scl 2; .type 32; .endef
cond:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %ecx
pushl %ebx
movl 8(%ebp), %ebx
testl %ecx, %ecx
setne %al
xorl %edx, %edx
testl %ebx, %ebx
setg %dl
testl %eax, %edx
je L1
addl %ebx, (%ecx)
1:
popl %ebx
popl %ebp
ret
.file "cond.c"
.text
.p2align 4,,15
.globl _cond
.def _cond; .scl 2; .type 32; .endef
_cond:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %ecx
pushl %ebx
movl 8(%ebp), %ebx
testl %ecx, %ecx
setne %al
xorl %edx, %edx
testl %ebx, %ebx
setg %dl
testl %eax, %edx
je L1
addl %ebx, (%ecx)
L1:
popl %ebx
popl %ebp
ret
这里就没有采用逻辑短路机制,&&前后的两个条件都进行了计算
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/elated/archive/2010/12/25/6097348.aspx