这是我的基本C测试程序。
在我构建它之后,我在控制台中输入了负数-1
,-2
等。
但结果是"哦"而不是"另一个数字"。
我不知道为什么会发生这种情况,因为负面的数字应该会导致“如果'声明是真的。
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");
}
}
答案 0 :(得分:2)
%ld
变量使用long
,%d
使用int
。将您的代码更改为以下其中一个:
int num;
scanf("%d", &num);
或
long int num;
scanf("%ld", &num);
答案 1 :(得分:2)
将%d
格式字符串与scanf一起使用时,相应的参数将被视为int*
。但是你通过了long int*
。值scanf
存储的大小与if
语句读取的大小不同。
正式地,您会得到未定义的行为。在实践中,在大多数平台上scanf
只会写入变量的一部分,其余的将留下任意值,通常会对将来的使用造成不良影响。
答案 2 :(得分:1)
/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]
修正这些警告的原因,所有的错误都会消失。