函數聲明/定義,書本上這句話怎麼理解,求大神解答?
if the declarators in the parameter declarations contain identifiers and the function declarator does not head a function definition, the identifiers go out of scope immediately。
如果形式參數聲明中的聲明符包含標識符,且函數定義的開頭沒有函數聲明符,則該標識符超出了作用域。
是這個意思嗎?
#include &
long func(int i, long l);
int main()
{
// 標識符i、l在這可以訪問?
}{
把全段話截圖上來了
return i + l;
}
我推薦你先不要糾結這些邊邊角角的東西,你那樣寫連編譯都通不過
函數聲明long func(int i, long l); 參數名可以不寫函數定義long func(int i, long l) { return l+i;}聲明要在使用之前出現就這三條規則,一點也不複雜
至於你問的那句話,是翻譯的不好,意思是,如果函數聲明裡出現了標識符(也就是參數名)並且這個函數聲明不是函數定義的頭部分,那麼這些標識符(參數名)是不被處理(立即離開作用域)的
用人話說就是:函數聲明裡可以不寫參數名這句話只是想說「函數聲明中,參數列表裡的參數名無法在別處引用」。
書上之所以寫這麼複雜,不寫「人話」,是因為這一段是《The C Programming Language》中對於函數聲明語法定義的說明。涉及「定義」的東西,為了嚴謹、巧妙避免重複,很容易寫出這樣的文字。
Similarly, if the declarators in the parameter declarations contain identifiers and the function declarator does not head a function definition, the identifiers go out of scope immediately.
類似地,如果形式參數聲明中的聲明符包含標識符,且函數定義的開頭沒有函數聲明符,則該標識符超出了作用域。
這裡的翻譯並不合適,這樣可能好一些:類似地,如果形式參數聲明中的聲明符包含標識符,且函數聲明符後未出現函數定義,這些標識符將立即超出作用域。
謝邀,函數聲明式中標識符僅僅是為了使使用者更清楚某個參數的意義,在函數聲明時,完全可以省略標識符,只寫參數類型
the identifiers go out of scope immediately
應當譯為「標識符立即(被認為是)(已經)超出(了)作用域」。
至於你貼的那段代碼,你得這麼看:函數調用就是一個堆棧體系,函數的參數也可以認為是棧變數。棧變數本質上是一種「創建的約定」,即「在創建這個函數的棧空間時,我這個變數也將在裡面佔一塊地盤!」,顯然只有在運行時才存在。你在main函數里使用i和l兩個東西,然而func根本沒有在此處於調用狀態,那你使用的是「哪裡的」i和l?記住以下幾點劉行了;
1.函數必須在使用前聲明,例如這裡就要聲明函數int func(int, int);也可以寫成int func(int x, int y);如果main函數在這裡,看上面兩句
int func(int x, int y)//此處不能省略形參名{……}綜上所述:1函數要麼在使用之前定義,2要麼在使用之前聲明一下有這個函數存在(例子屬於第二種)不然編譯器會認為該函數不存在,而報錯函數聲明(以上第二種情況)時可以忽略形參名,因為從編譯器角度來看,形參名沒什麼用,有類型就行了非函數定義頭部的函數聲明裡不用寫形參名
推薦閱讀: