看板 C_and_CPP 關於我們 聯絡資訊
這邊提一下c的變數宣告處理規則 當c看見一個變數宣告時 他的判斷方式其實是由內往外的 下面有一個把變數宣告轉換為英文的方法 參考自書籍 Expert C Programming Deep C Secrets, Peter Van Der Linder, page76 步驟1 發現一個變數,輸出"xxx is " 步驟2 看右邊有無"[...]"。 若有,輸出字串"array of ",然後跳到步驟4 步驟3 按右邊有無"(...)"。 若有,輸出字串"function return " 步驟4 往左邊看有無'('。 如果可以成對群組起來就丟掉,跳到步驟2 步驟5 看左邊有無"const"。 如果有,就輸出 "read only ",跳到步驟4 步驟6 看左邊有無'*'。 如果有,輸出 "pointer to ",跳到步驟4 步驟7 發現基本型態。直接輸出該型別 這邊demo一下 我不會改顏色 所以用上一行的底線來標記處理區域 ____ char * const *(*next)(); 執行步驟1,輸出"next is a ..." _____ char * const *(* )(); 執行步驟2往右找,沒發現中括號。不是array 步驟3,沒發現右邊有(...)。也不是function ______ char * const *(* )(); 開始往左找 步驟4、5也都比對失敗 步驟6,左邊有星號,所以輸出變成 "next is a pointer to ..." _______ char * const *( )() 步驟2 3比對失敗 步驟4發現成對小括號,拿掉 _________ char * const * () 步驟2失敗 步驟3,發現右邊有() 輸出變為 "next is a pointer to function return .." _ char * const * 步驟2 3 4 5 都失敗 步驟6發現左邊有* 輸出:"next is a pointer to function return pointer to ..." _____ char * const 步驟 5 發現有const 輸出:"next is a pointer to function return pointer to read-only ..." _ char * 步驟6發現* "next is a pointer of function return pointer to read-only pointer to ..." ____ char 步驟7發現char "next is a pointer of function return pointer to read-only pointer to char." ----------------------------------------------------------------------------- 這邊有一個習題 char *(*c[10])(int**p); 解讀出來應該是 c is array[10] of pointer to function return pointer to char ----------------------------------------------------------------------------- 最簡化的記法 如果不考慮array與function 只看最後面幾個步驟的說明 const修飾指標的解讀一律都是右邊往左 所以 char * p; p is pointer to char. const char * p; p is pointer to char read-only. char const * p; p is pointer to read-only char. (和上面一樣) char * const p; p is const pointer to char. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.210.62
loveme00835:你都說由右往左, 寫成 char const 比較清楚 11/09 00:19
loveme00835:其實寫左邊很容易讓人亂掉, 還以為是修飾右邊 11/09 00:20
iamstudent:可能是因為const放左邊比較接近英文吧,所以也很多人寫 11/09 00:27
iamstudent:const int xxx; 和 int const xxx; 好像前者較多? 11/09 00:28
handsomepow:感謝i大說明 11/09 00:32
mythnc:char * p; p is pointer to char 11/09 00:33
已經修正,其實本來是想要打char**p;的
akasan:#1B_2w2Uj 看到const 就會想到tinlans這篇好文 11/09 00:46
※ 編輯: iamstudent 來自: 140.113.251.45 (11/09 01:19)
loveme00835:我看了《C++ Templates》之後, 一律把const擺右邊 11/09 01:26
xatier:Deep C Secrets 那本有超多外星密技的! 11/09 02:40
Favonia:http://cdecl.org/ 11/09 13:19
hilorrk:san大跟我想到同一篇神文XD 11/09 22:29
xatier:F大的網站....\("▔□▔)/ 11/10 00:22
Arton0306:推 看了這篇我才知道要怎麼解讀一長串的宣告 11/10 23:23