由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