今天试着以递归的方式用C写了个斐波那契数列,最后我想经过scanf函数从控制台中输入一个整形数,输入出该整形数据对应的结果是多少.函数
其中是这么定义的 : int nu = scanf("%d",&nu);调试
控制台输入一个整形数3,回车后,程序进入了死循环。调试输出后发现输入3后,nu的值为1,试着输入其余的整形数nu仍是1。递归
因而我将代码改了一下 int nu; scanf("%d",&nu); 在控制输入3后,打印输出的nu为3 -- 这才是我想要的结果. 但为何会这样呢?内存
解释第一个: 按JAVA的理解应该是scanf从控制台获得输入的值,而后再赋值给nu才是. 通过网上查询后,终于知道为何了,由于scanf的返回值是将匹配成功的个数返回. 也就是说当时我输入的是3,scanf用%d去匹配并读入文件,只匹配到一个而且读入文件的也只有一个因此返回是1,nu接收到这个值也就是1。字符串
解释第二个:&nu中的&是地址运算符,&nu指nu在内存中的地址,scanf经过地址将nu存入到变量nu中。因此输出的nu 为控制台输入的值。get
总结下来就是scanf的赋值与返回值的问题.变量
若是改为: int nu,nu1,nu2;
nu1 = scanf("%d",&nu);循环
printf("nu=%d nu1=%d\n",nu,nu1);程序
nu1 = scanf("%d,%d",&nu,&nu2); (输入时用,号隔开)
printf("nu=%d nu1=%d\n",nu,nu1); 这样就会更加明白scanf的返回值和赋值是怎么一回事了. 总结
// 关于输入与输出
输入: scanf(); 输入的字符串不能有空格 gets(); 能够有空格
输出:printf(“%s”,str); puts(str); 输出时自动换行