閱讀534 返回首頁    go 阿裏雲 go 技術社區[雲棲]


由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

  上一篇:go 今天用Windows Live Writer 再寫把博客哈哈
  下一篇:go 關於靜態方法