書上寫C語言又規定在以下幾種情況時可以省去主調函數中對被調函數的函數聲明:1.如果被調函數的返回值是整型或字符型時,可以不對被調函數作說明,而直接調用,這時系統將自動對被調函數返回值按整型處理.書上是這樣寫的但是如果函數是long的時候仍需聲明函數,難道long不算整型嗎?比如這個:#include "stdio.h"long f1(int p){int k;long r;long f2(int);r=f2(p);return r*r;}long f2(int q){long c=1;int i;for(i=1;i<=q;i++)c=c*i;return c;}main(){int i;long s=0;for(i=1;i<=5;i++)s=s+f1(i);printf("\ns=%ld\n",s);}
3 回答

忽然笑
TA貢獻1806條經驗 獲得超5個贊
第一,如果你沒有看錯就是你的書錯了,只有int和char類型的函數不必聲明
第二,C中可以不聲明函數的條件是3個
1就是上面我說的
2.是被調函數定義在主調函數之前,可不必聲明
3函數的外部已聲明過了,個個主調函數中不必聲明
對于第二點,很好解釋,因為聲明的目的在于告訴編譯器有這么個自定義函數,返回類型是什么,如果被調函數定義在主調函數之前,那么編譯器自然就知道了這個函數
你把f2和f1換下位置并去掉聲明就明白了
再說一句,寫函數聲明是編寫程序的良好習慣
請注意這是C程序,C官方聲明標準編譯器是Turboc 2。0
不要把C++的概念強加給C
我不是說VC++6不好,而是說既然是在學C,就要用標準的C編譯器,只有標準C編譯器才能正確的學習C的基礎理論

SMILET
TA貢獻1796條經驗 獲得超4個贊
這同你的編譯器有關。
我用 MS VC++ 編譯器, 用 cl 命令編譯鏈接, 把你的代碼去掉long f2(int), 編譯后執行正確無誤。
你可以把
f1(int p) { 。。。}
和
f2(int q) {。。。}
次序對調一下,這時省去原型聲明long f2(int),也許就可以了。
因為f1要用到f2,先聲明f2,后聲明f1. 你的編譯器較笨。書上是對的。
- 3 回答
- 0 關注
- 250 瀏覽
添加回答
舉報
0/150
提交
取消