类型系统

C语言(几乎)是一个强类型语言

一些人声称C语言不是一个强类型语言[1],但我认为它是——只是因为C编译器在类型检查时,通常表现微弱。换言之,C允许程序员在这些规则上表现怠慢。我喜欢把C称为一个‘弱化的强类型’语言。其他人可能只称它为静态类型语言。不管怎样,跟踪类型非常重要。

强类型语言的定义是,每一个变量、函数调用和每一个常量,都具有一些在编译时指定,并且由编译器强制执行的类型[2]。在比C更严格的语言中,你将不能把一个字符赋值给一个整数变量,或者把一个整数赋值给一个浮点数变量;并且你肯定不能做很多你能对指针做的事。尽管如此,C确实强加了不同的类型规则,像我们将看到的。

C的类型被分为三个主要组:对象类型,函数类型和不完整类型。(不完整类型可能会与对象类型归为一组,但是C标准把它们分开。) 对象类型基本上用来声明变量,函数类型用于声明函数。不完整类型是对象类型在一些重要信息,未被提供时的一种特殊情形。一个不完整类型通常在被补充上所需信息后达到完整。

这些类型可以按不同方式分组。我喜欢分为‘基本’和‘派生’类型。基本类型简单地是在列表中的:

    char
    signed char
    unsigned char
    short int
    unsigned short int
    int
    unsigned int
    long int
    unsigned long int
    long long int (new in C99)
    unsigned long long int (new in C99)

    float
    double
    long double
    float complex (new in C99)
    double complex (new in C99)
    long double complex (new in C99)

float,double,long double和三个complexes之外的那些类型是整型。三种char变种都称为字符型。最后六种是浮点数类型,分为实数和复数浮点数类型。

许多整型有简略的名字,因为在short和long之后的int关键字可以被省略。(在C89中你甚至能在更多的情形下省略它,但是C99几乎去除了‘隐含int’。) 类型char(有时称为‘简单的char’)确切地具有相同的特点——最小值,最大值和sizeof——对于实现决定的signed char或unsigned char。int类型通常是‘相似的’,对short或long。但是所有这些类型都被认为是不同的,甚至在特征匹配时混淆使用(比如与下面讲到的指针)它们是也是一个错误(这是C被视为强类型语言的一个理由)。

作为一个特殊情况,C具有与一些整型‘兼容’的枚举类型,即使如此却是截然不同的类型。作为另一种特殊情况,C提供void类型,它仅仅是一种不能被完整的不完整类型。不存在真正的void类型的值,这有时是一种自我矛盾。(把它看作空值集合。因为所有空集合都是一致的,它有或者没有哪些值都不要紧。)

这些基本类型被用于构建派生类型。派生类型有时也指不完整类型和函数类型。派生类型是: