0

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

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

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

如果我有另一个变量a,并检查是否a > b,逻辑运算的返回是1or 0; 这个值是怎么得到的?它是一个函数吗?

4

3 回答 3

4

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

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

于 2013-08-19T06:32:07.687 回答
2

编译器处理这个问题的方式是将其翻译成适当的机器指令。

在这种情况下:

if (b)

那么这通常在 x86 机器上被翻译成这样的:

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

上面的代码告诉你零是 cpu 中的一种特殊情况,因为许多(如果不是大多数)指令在对值进行操作时会设置一些内部标志,以便之后可以执行jzand jnz(如果不为零则跳转) .

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

作为比较,对于cpu可以原生处理的类型,有内置指令:

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

您可以在此处找到更多跳转指令:Intel x86 JUMP 快速参考

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

像这样的东西:

mov  eax, a    ; eax = a
mov  ebx, b    ; ebx = b
call function  ; call comparison function, result returned in eax
cmp  eax, eax
jz   notequal
于 2013-08-19T06:56:17.120 回答
0

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

于 2013-08-19T06:48:59.080 回答