阅读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 关于静态方法