首頁 >後端開發 >C++ >什麼是 C 的「最令人煩惱的解析」以及它如何誤導函數宣告?

什麼是 C 的「最令人煩惱的解析」以及它如何誤導函數宣告?

Barbara Streisand
Barbara Streisand原創
2024-11-24 13:22:12545瀏覽

What's C  's

C 最令人煩惱的解析

在 C 中,解析程式碼片段的方式可能會導致意外的行為。一個臭名昭著的例子被稱為「最令人煩惱的解析」。

函數宣告之謎

考慮以下程式碼:

widget w(gadget(), doodad());

乍一看,它似乎宣告了一個名為w 的widget 類型的變數。然而,這段程式碼實際上定義了一個名為 w 的函數,它接受兩個參數。

參數衰減和指標轉換

在函數宣告中,陣列類型的參數衰減為指標到第一個元素,函數型別的參數衰減為函數指標。因此,w 的等效聲明是:

widget w(gadget(*)(), doodad(*)());

這表示函數 w 將一個指向不帶參數並傳回小工具的函數的指標作為其第一個參數。它還需要第二個參數,一個指向不帶參數並傳回小玩意的函數的指標。函數本身傳回一個小部件。

額外的複雜性

「最令人煩惱的解析」在以下情況下變得更加混亂:

widget w(gadget(x));

如果x已經是一個變量,如何將其解釋為函數聲明?答案在於,在 C 中,宣告變數時可以使用額外的括號。因此,小工具 x;和小工具(x);兩者都聲明了名為 x 的相同變數。因此,上面的程式碼是一個函數的聲明,該函數採用名為 x 的 gadget 類型的第一個參數,並傳回一個小部件。

以上是什麼是 C 的「最令人煩惱的解析」以及它如何誤導函數宣告?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn