C语言中包括了丰富的数据类型,包括了声明中显式定义的类型和用做表达式中间类型的导出类型。例如:
int *p, x;
*p = x;
从这里我们可以知道x的地址类型(它的左值)是一个指向整数的指针。x值的类型(它的右值)是一个整数。
C语言的类型其实可以用前缀形式表示,什么是前缀形式呢,看下面的例子:
我们用一个表达式: a + b*c - (d + e) ,对于这样的表达式好像都熟悉,它就是所谓的中缀表达式
它的前缀表达式是: -+a*bc+de;求解过程就不详述了,但有一点就是,我们可以看到前缀表达式操作数在操作符之后 。
同样我们可以把C语言的类型定义为类型操作符和类型操作数的结合,而我们平时所看到的则是这种定义的“中缀表达式”,再回到刚才的例子,
int *p 声明了p是指向int的一个指针,所以这里int *,指针是操作符,int是操作数.
我们再看一个例子: char *(*strings)[10].
如果根据《C专家编程》里讲的,我想你很快就会明白这个声明的含义, 我们根据此书里的步骤分析一下:
通过上面的分析,可以知道: strings是一个指针,指向一个大小为10为数组,每个数组元素是一个指针,指向字符的指针.
其实如果把它表示为前缀的形式,该是什么样的呢:
(POINTER (ARRAY 10 ( POINTER (CHAR) ) ) )
其中POINTER为操作符,剩下的为它的操作数,以此类推,ARRAY也为操作符,剩下的是它的操作数,等等。
上面所说的POINTER,ARRAY,CHAR等都是类型操作符的编码,这些操作符所带有的操作数是不同的,下面首先列出所有的操作符编码:
CHAR LONG ARRAY FUNCTION INT ENUM STRUCT CONST
UNSIGNED FLOAT UNION VOLATILE SHORT DOUBLE POINTER VOID
其中操作符CHAR, INT, UNSIGNED, SHORT, LONG ,ENUM定义了整数类型,FLOAT, DOUBLE定义了浮点类型,这些类型都为算术类型,除了ENUM以外,其他的都没有操作数. ARRAY, STRUCT, UNION为聚合类型,STRUCT和UNION没有操作数,ARRAY的操作数是数组元素的类型;POINTER和FUNCTION分别定义为指针类型和函数类型,它们的操作数分别指明被引用类型和返回类型.
下面举个例子:
(ARRAY 40 (INT 4 ) )
它的实际表示就是 int a[40];