- 論壇徽章:
- 2
|
回復(fù) 1# L_kernel
無(wú)論是好是壞…… C語(yǔ)言已經(jīng)成這個(gè)樣子了……
趁著首頁(yè)還在, 還是正經(jīng)回復(fù)一下吧……
同一個(gè)名字/標(biāo)識(shí)符,可以指代不同的東西 —— 無(wú)論是否應(yīng)該這樣編寫(xiě)代碼 —— 這個(gè)應(yīng)該是蠻常見(jiàn)的。比如:
- void f(void)
- {
- /* ^ */ /* ^ */
- int x,y; /* | */ /* | */
- /* A */ /* */
- /* | */ /* */
- /* v */ /* */
- { /* ^ */ /* */
- double x,z; /* | */ /* */
- /* B */ /* C */
- /* | */ /* */
- } /* v */ /* */
- /* ^ */ /* */
- /* | */ /* */
- /* A */ /* */
- /* | */ /* | */
- /* v */ /* v */
- }
復(fù)制代碼 在C范圍內(nèi), y 指代那個(gè) int 變量。
在(兩個(gè))A范圍內(nèi), x 指代那個(gè) int 變量
而中間的B范圍內(nèi), x 指代那個(gè)double變量。 z指代另一個(gè)double變量。
這是通過(guò)名字出現(xiàn)的位置決定名字指代物。
而 struct x x; 是另一種情況。
是通過(guò)名字的種類/作用決定名字的指代物。
- struct /* 有了 struct "前綴" 后續(xù)的 */
- x /* 就是指一個(gè) tag 而不是別的東西 */
- /* 之后的 */
- x /* 就是一個(gè)普通標(biāo)識(shí)符 */
- ; /* 兩者不會(huì)沖突 */
- x : /* x 指 label 同樣不會(huì)沖突 */
復(fù)制代碼 PS:
對(duì) lable 是函數(shù)作用域而不是塊作用域感到驚訝的同學(xué),可以問(wèn)問(wèn)使用js的同學(xué)是什么感受……
對(duì) C語(yǔ)言區(qū)分ordinary/member/tag/label 感到驚訝的同學(xué),可以參考lisp-1與lisp-2之間爭(zhēng)論。 |
|