由ANSI C標準咬文嚼字發現滴東東
由ANSI C標準咬文嚼字發現滴東東
亂彈
奧運磨煉曲正酣,鋼鐵功夫解眼饞;
步履蹣跚遭埋怨;呆呆傻傻惹人煩;
渾渾噩噩心難安;四目相對眼茫然;
龍遊淺水被蝦戲;死不悔改表亂彈!
(表:biao第四聲)
侯佩|hopy
2008年05月08日於合肥電心
忙來有事,開始重讀<< C專家編程 >>。
在第1章的1.9節[閱讀ANSI C標準,尋找樂趣和裨益](第19頁)中找到
貌似可以展開的東西,我變通作者的意思舉例如下:
[例0]
int main() //0
{ //1
char *p; //2
const char *cp; //3
//4
p = cp; //Error,but why? //5
cp = p; //Right,but why? //6
//7
return 0; //8
} //9
請解釋為什麼第5行錯誤而第6行正確。
無從下手?先看看作者是怎麼說的吧!作者首先說:
標準規定編譯器隻有在違反語法規則和約束條件的情況下才
能產生錯誤信息!
然後作者變戲法似的在ANSI C 的第6.3.16.1節中拎出一個約束條件A:
要使上述賦值形式合法,必須滿足如下條件之一:
a.兩個操作數都是指針;
b.兩個指針都指向有限定符或無限定符的相容類型;
c.左邊指針指向的類型必須具有右邊指針所指向類型的全部限定符。
顯然 p 和 cp 都指向 char 因此是相容的,而且cp的限定符包容p的限定符,
因此第6行正確,第5行則錯誤。
So easy,下一個例子:
[例1]
int main() //0
{ //1
char **pp; //2
const char **cpp; //3
//4
cpp = pp; //Error,but why? //5
pp = cpp; //Error or Right? //6
//7
return 0; //8
} //9
現在請再解釋為什麼第5行是錯的?按照如上推理,貌似 const char **
包容 char ** 呀,為什麼是錯的呢?現在偶來嚐試解釋一下,看大家
能不能聽懂:
pp指向的類型是 char*,cpp指向的類型是 const char*,兩者
不相容,違反了約束條件A中的b這一條,所以是錯的。That's all.
由此可知第6行也是錯的。現將例0做一番擴展:
[例2]
int main() //0
{ //1
char *p; //2
register char *rp; //3
volatile char *vp; //4
//5
p = rp; //??? //6
p = vp; //??? //7
//8
return 0; //9
} //10
請問第6行和第7行誰對誰錯?留給大家思考吧,嗬嗬。
如果你依然清醒,那麼請不要動手,隻動腦思考一道題:
[題目]
typedef char * p2c;
int main()
{
char **pp;
const **cpp;
p2c *_pp;
const *_cpp;
pp = _pp; //A
_cpp = _pp; //B
_pp = _cpp; //C
_cpp = pp; //D
cpp = _cpp; //E
return 0;
}
請判斷A-B的對錯,並說說為什麼?
以上文章純屬亂彈,如有不對之處請毫不猶豫的指出吧!:)
另外最後的題目是給我自己恢複記憶留的(不是恢複人性,因為偶不
是... -_-b),各位不要當真,一笑置之吧。
侯佩的侯,侯佩的佩|hopy
2008年05月08日2051第一稿
最後更新:2017-04-02 00:06:29