作者iamstudent (stu)
看板C_and_CPP
標題Re: [問題] const問題
時間Wed Nov 9 00:11:36 2011
這邊提一下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
推 hilorrk:san大跟我想到同一篇神文XD 11/09 22:29
推 xatier:F大的網站....\("▔□▔)/ 11/10 00:22
推 Arton0306:推 看了這篇我才知道要怎麼解讀一長串的宣告 11/10 23:23