今天試着以遞歸的方式用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); 輸出時自動換行