编译器是否将此逻辑操作作为函数处理?

时间:2013-08-19 06:28:40

标签: c

我想知道我何时使用此代码,例如:

#include <stdio.h>
int main(){
    int b;
    scanf("%d",&b);
    if (b)
        printf("right\n");
    else
        printf("zero entered\n");
    return 0;
}

编译器如何知道如果b!= 0,它应该执行printf("right\n"); .....如果b == 0它应该执行printf("zero entered\n");

如果我有另一个变量a,并检查是否a > b,逻辑操作的返回值为10;如何获得这个值?这是一个功能吗?

3 个答案:

答案 0 :(得分:4)

在C中,所有非零值都是“真”,只有零是“假”。

对于比较a > b,根据类型,运行程序的CPU中有指令进行比较,编译器在编译程序时会生成这些指令。对于没有本机比较指令的类型,应由编译器实现如何处理它们。

答案 1 :(得分:2)

编译器处理此问题的方法是将其转换为适当的机器指令。

就此而言:

if (b)

然后这通常是在x86机器上翻译成这样的东西:

cmp eax, eax ; compare register eax with itself
jz  target   ; jump to target if zero

上面的代码告诉你零是cpu中的一个特例,因为许多(如果不是大多数)指令在对值进行操作时会设置一些内部标志,因此jz和{{ 1}}(如果不是零则跳转)可以在之后完成。

还有其他标志,溢出,进位,标志,奇偶校验。

至于比较,对于可以由cpu本地处理的类型,有内置指令:

jnz

您可以在此处找到更多跳转说明:Intel x86 JUMP quick reference

如果无法原生处理类型,通常会涉及函数调用,它返回0/1(或0 / N,注意N可以为负)值,在这种情况下它会回退到{{ 1}}处理该函数结果的指令类型。

这样的事情:

mov eax, a  ; eax = a
cmp eax, b  ; compare eax to b
jl  target  ; jump to target if less (eax < b --> a < b)

答案 2 :(得分:0)

如果要检查值是true还是false,则应始终与零进行比较,因为除零之外所有整数都为真。