由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第一稿
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大熊猫侯佩

赏点钱让我买杯可乐好吗 ;)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值