我在 C 语言的签名数中遗漏了什么吗?

Is there anything that i missed in signed number in C language?

这是我的基本C测试程序。 在我构建它之后,我只是在控制台中输入负数,如 -1-2 等。 但是结果是"oh",不是"another number"。 我不知道为什么会这样,因为负数应该使 'if' 语句为真。

int main(int argc, char* argv[]){
    long int num;

    scanf("%d", &num);

    if(num ==1 || num < 0){
        printf("another number\n");
    }else{
        printf("oh\n");
    }
}

long 个变量使用 %ld,对 int 个变量使用 %d。将您的代码更改为以下之一:

int num;
scanf("%d", &num);

long int num;
scanf("%ld", &num);

当您将%d 格式字符串与scanf 一起使用时,相应的参数将被视为int*。但是你已经通过了long int*scanf 存储的值将与您的 if 语句读取的大小不同。

形式上,您会得到未定义的行为。实际上,在大多数平台上 scanf 只会写入变量的一部分,其余部分将留有任意值,这通常会对以后的使用造成不良影响。

/tmp$ gcc -Wall foo.c
foo.c: In function ‘main’:
foo.c:4:5: warning: implicit declaration of function ‘scanf’ [-Wimplicit-function-declaration]
foo.c:4:5: warning: incompatible implicit declaration of built-in function ‘scanf’ [enabled by default]
foo.c:4:5: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘long int *’ [-Wformat]
foo.c:7:9: warning: implicit declaration of function ‘printf’ [-Wimplicit-function-declaration]
foo.c:7:9: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
foo.c:9:9: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
foo.c:11:1: warning: control reaches end of non-void function [-Wreturn-type]

修复这些警告的原因,所有错误都会消失。