我想知道我何时使用此代码,例如:
#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
,逻辑操作的返回值为1
或0
;如何获得这个值?这是一个功能吗?
答案 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,则应始终与零进行比较,因为除零之外所有整数都为真。