<<爱丽丝漫游奇境记>>
作者笔名:Lewis Carroll
作者真名:Charles Dodgson
事件:维多利亚女王
编程语言中的类型模型(type model)。例如,下面的C语言声明:
typedef char *string;
string punchline = "I'm a frayed knot";
按照骑士的思维方式,他会这样进行理解:
被称作 是
变量的类型 string char *
变量 punchline I'm a frayed knot
3.1 只有编译器才会喜欢的语法
Kernighan和Ritchie承认,“C语言声明的语法有时会带来严重的问题”。C语言声明的语法对于编译器(或编译器设计者)的处理来说并不是什么大不了的事。C语言声明的语法实在是非常可怕,渗透于整个语言使用的方方面面。毫不夸张地说,正是由于在组合类型方面的笨拙行为,C语言被
显著且毫无必要地复杂化了。
C语言 类型模型(type model)
BCPL语言(C语言的祖先)几乎没有类型,它把二进制字作为唯一的数据类型,所以C语言先天有缺。然后出现了一种C语言设计哲学,要求对象的声明形式与它的使用形式尽可能相似。这种做法的好处是各种不同操作符的优先级在“声明”和“使用”是一样的。 它的缺点在于操作符的优先级是C语言中另外一个设计不当、过于复杂之处。
一个比较好的声明指针的方法是:
int &p;
它至少能提示p是一个整型数的地址。这种语法已被C++采纳,用于表示参数的传址调用。
C语言的声明所存在的最大问题是,你无法以一种人们所习惯的自然方式从左向右阅读一个声明,在ANSI C引入了volatile和const关键字后,情况就更糟糕了。volatile和const关键字后,只能出现在声明中,而不是使用中。风格看上去像是声明,但却没有标识符的东西(如形式参数声明和
强制类型转换)看上去滑稽。
强制类型转换
char (*j)[20]; //j是一个指向数组的指针,数组内有20个char元素
j = (char (*)[20]) malloc(20);
//the object pointed to by pointer is read_only
const int *grape;
int const *grape;
//pointer is read_only
int * const grape_jelly;
//the object pointed to by pointer is read_only and pointer is also read_only
const int * const grape_jam;
int const * const grape_jam;
ANSI C提到,typedef说明符之所以被称为“存储类型说明符”,只是为了语法上的方便而已。
char * const *(*next)();
你能知道如何分析这个函数的声明吗?