C 語言最令人煩惱的解析重溫
當看似無害的語句可以被解釋時,C 中臭名昭著的「最令人煩惱的解析」現象就會出現作為函數宣告或變數宣告。這可能會導致意外的行為和難以調試的錯誤。
一個經典的例子是程式碼片段:
widget w( gadget(), doodad() );
乍一看,這似乎是一個變數聲明名為w 的小部件,帶有帶括號的初始值設定項。然而,經過仔細檢查,我們意識到 gadget() 和 doodad() 是函數調用,使該語句成為函數宣告。
之所以會出現歧義,是因為數組類型的函數參數衰減為指向其第一個元素的指針,而函數類型的函數參數會衰減為函數指針。這意味著上面函數的簽章實際上是:
widget w( gadget(*)(), doodad(*)() );
換句話說,它接受兩個函數指標作為參數並傳回一個小部件。
當變數出現時,會出現更令人困惑的情況涉及到:
widget w(gadget(x));
由於 x 是一個變量,所以似乎不可能將其解釋為函數聲明。然而,C 允許在變數宣告中使用額外的括號。因此,小工具 x;和小工具(x);宣告相同的變數 x。
因此,上面的程式碼可以被解析為一個函數聲明,它採用名為 x 的 gadget 類型的單一參數並傳回一個小部件。這證明了理解複雜的 C 語法以避免這些微妙陷阱的重要性。
以上是為什麼 C 的「最令人煩惱的解析」會將變數宣告誤解為函數宣告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!