函數聲明/定義,書本上這句話怎麼理解,求大神解答?

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要麼在使用之前聲明一下有這個函數存在(例子屬於第二種)不然編譯器會認為該函數不存在,而報錯

函數聲明(以上第二種情況)時可以忽略形參名,因為從編譯器角度來看,形參名沒什麼用,有類型就行了


非函數定義頭部的函數聲明裡不用寫形參名


推薦閱讀:

TAG:編程語言 | C編程語言 | CC | C語言入門 |