C语言程序里,已经在开头声明了类型的变量,为什么在标准输入函数scanf中还要再作一次格式规定?

在一个C语言程序里头,已经在开头声明了类型的变量,为什么在标准输入函数scanf中还要再作一次格式规定:如
main()
{
int num1,num2,i,min;
scanf(%d%d,&num1,&num2);
min=num1
for(i=min/2;i>0;i--)
if(num1%i==0&&num2%i==0) break;
printf(最大公约数为%d\n,i);
}
在这个式子中,既然一开始已经用int来声明num1,num2,i,min等变量是整形变量了,但为什么接下来的scanf(%d%d,&num1,&num2);却还要用%d来再规定一次输入的变量类型?难道一开始的类型声明管不着输入的类型吗?岂不是多此一举吗?

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为: scanf(“格式控制字符串”,地址表列); 其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串, 也就是不能显示提示字符串。地址表列中给出各变量的地址。 地址是由地址运算符“&”后跟变量名组成的。例如,&a,&b分别表示变量a和变量b 的地址。这个地址就是编译系统在内存中给a,b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系如下: &a--->a567 a为变量名,567是变量的值,&a是变量a的地址。在赋值表达式中给变量赋值,如: a=567 在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。 这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。
void main(){
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
注意&的用法!
在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入。用户输入7、8、9后按下回车键,此时,系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔, 因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。
如: 7 8 9

7
8
9
你上面那个是错的,应该是地址!
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-08-26
%d是引用说明符,用来解释输入的数据是整形,比如你输入3,既可以解释成整型,也可以解释成浮点数。%d将3以int表示方式放入地址&num1等。编译器并不会智能检测参数然后匹配输入为参数类型,你把它想得太智能了。本回答被提问者采纳
第2个回答  2011-08-28
每种变量的内存大小并不是完全相同的,比如double是8,char是1。如果写错了的话这个函数就会出错的。。
第3个回答  2011-08-26
开始申明变量的类型是为了给变量开辟相应的空间大小(int 2字节 ,char 1字节),
在scanf语句中并不能给变量开辟空间,所以变量类型说明不能省!
第4个回答  2011-08-26
。。。因为就算你不匹配,也是可以输入的呀,不过就是精度有变化了
比如你定义的是double
但是你确用%d来读取
这是可以的,只会出现warning
相似回答