对于 x86 汇编,“cmp”指令设置两个标志:“ZF”和“CF”,允许通过一次比较确定两个整数是否等于或大于或小于。应该如何用 C 编写代码才能对所有三种情况仅执行一次比较?有 6 个选项可供选择:
if (x > y) { /*code1*/ } else if (x < y) { /*code2*/ } else { /*code3*/ }
if (x < y) { /*code2*/ } else if (x > y) { /*code1*/ } else { /*code3*/ }
if (x > y) { /*code1*/ } else if (x == y) { /*code3*/ } else { /*code2*/ }
if (x < y) { /*code2*/ } else if (x == y) { /*code3*/ } else { /*code1*/ }
if (x == y) { /*code3*/ } else if (x < y) { /*code2*/ } else { /*code1*/ }
if (x == y) { /*code3*/ } else if (x > y) { /*code1*/ } else { /*code2*/ }
一般来说,我们在 C 中所做的就是编写常规的 if-else 语句,而不考虑机器语言中发生的情况,并依靠编译器来优化它。
因此,以下 C 语句:
if( x > y )
/* code1 */
else
/* code2 */
将由一个像样的编译器进行优化,并启用足够的优化,如下所示:
mov eax, [x]
cmp eax, [y]
jbe code2
/* code1 */
jmp after
code2:
/* code2 */
after: