C语言中格式说明符与变量不匹配的问题
2023年11月6日...大约 2 分钟
先来看一段代码
#include<stdio.h>
int main(){
long long int a,b;
scanf("%d %lld",&a,&b);
printf("a=%d b=%lld\n",a,b);
if(a<0) printf("a小于0");
}
为了对照我分别用%d和%lld取值 你很明显可以看到这里的a的格式说明符与变量类型不同
当我们运行代码并且输入下面的内容
-1 5
然后程序就会输出
a=-1 b=5
你会发现输出没有问题 但是我们输入的不是-1吗? 为什么不会输出a小于0?
错误发生的根本原因是格式说明符与变量类型的不匹配 在代码中a被声明为 long long int 类型,这是一个64位的整数类型 而%d是为int准备的格式说明符 因此scanf会根据%d格式说明符的指示 只读取足够的数据来填充一个32位的int
既然明白了以上原理我们很容易可以用代码来证明
#include<stdio.h>
int main(){
long long int a,b;
scanf("%d %lld",&a,&b);
printf("a=%lld b=%lld\n",a,b);
if(a<0) printf("a小于0");
}
我们再次和上面输入同样的
-1 5
我们得到了一个很奇怪的值
a=4294967295 b=5
这是因为scanf只读写了32位的数据而printf却输出了64位的数据!
而且就由这个小例子就可以看出计算机优先读取和存储的是低位!
既然a=4294967295那肯定是大于0咯
当然 新手大多数都会犯这样的错 如果看不懂的话 就记住!!!格式说明符与变量类型一定要匹配
再扩展一点 通过这个例子改版也可以看出你的操作系统的版本