1. 整型家族
C语言的整型家族包括字符、短整型、整型和长整型。它们都分为有符号(signed)和无符号(unsigned)。
在C语言中长整型至少和整型一样长,而整型至少应该和短整型一样长。
标准并未规定长整型必须比短整型长,只是规定它不得比短整型短。
ANSI C标准加入了一个规范,说明了各种整型的最小允许范围。如下表:
类型 | 最小范围 |
---|---|
char | 0~127 |
signed char | -127~127 |
unsigned char | 0~255 |
short int | -32767~32767 |
unsigned short int | 0~65535 |
int | -32767~32767 |
unsigned int | 0~65535 |
long int | -2147483647~2147483647 |
unsigned long int | 0~4294967295 |
short int
至少16位,long int
至少32位。至于缺省的int
究竟是16位还是32位则是由编译器设计者决定。
头文件limits.h
说明了各种不同的整数类型的特点。limits.h
同时定义了下列名字:CHAR_ BIT
是字符型的位数(至少8位); CHAR_MIN
和CHAR_MAX
定义了缺省字符类型的范围,它们或者应该与SCHAR_MIN
和SCHAR_MAX
相同,或者应该与0和UCHAR_MAX
相同;最后,MB_LEN_MAX
规定了一个多字节字符最多允许的字符数量。
signed | signed | unsigned | |
---|---|---|---|
类型 | 最小值 | 最大值 | 最大值 |
字符 | SCHAR MIN | SCHAR_ MAX | UCHAR MAX |
短整型 | SHRT MIN | SHRT_ MAX | USHRT MAX |
整型 | INT_ MIN | INT MAX | UINT_ MAX |
长整型 | LONG MIN | LONG MAX | ULONG MAX |
尽管设计char类型的目的是为了让它们容纳字符型数值,但字符在本质上是小整型值。
2. 浮点类型
浮点数家族包括float、double 和long double类型。通常,这些类型分别提供单精度、双精度以及在某些支持扩展精度的机器上提供扩展精度。
ANSI 标准仅仅规定long double 至少和double样长,而double至少和float一样长。
标准同时规定了一个最小范围:所有浮点类型至少能够容纳1037~1037之间的任何值。
头文件float.h
定义了名字FLT_MAX
、DBL_MAX
和LDBL_MAX
,分别表示float、double和long double所能存储的最大值。而FLT_MIN
、DBL_MIN
和LDBL_MIN
则分别表示float、double 和long double能够存储的最小值。这个文件另外还定义了一些和浮点值的实现有关的某些特性的名字,例如浮点数所使用的基数、不同长度的浮点数的有效数字的位数等。
浮点数字面值总是写成十进制的形式,它必须有一个小数点或一个指数,也可以两者都有。例如:
3.14159
1E10
25.
.5
6.023e23
浮点数字面值在缺省情况下都是double类型的,除非它的后面跟一个L或1来表示它是一个long double类型的值,或者跟一个F或f来表示它是一个float类型的值。
3. 字符串常量
字符串就是一串以NUL
字节结尾的零个或多个字符。字符串通常存储在字符数组中。
即使是空字符串,也依然存在作为终止符的NUL
字节。
在字符串常量的存储形式中,所有的字符和NUL
终止符都存储于内存中某个位置。
ANSI C声明,如果对一个字符串常量进行修改,其效果是未定义的。
在程序的使用中字符串常量会生成一个"指向字符的常量指针"。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址。
不要把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,而不是这些字符本身。
4. 求值顺序
C语言中只有4个运算符(&&
、||
、?:
和,
)存在规定的求值顺序。
分割函数参数的逗号并非逗号操作符的逗号。例如,x和y在函数f(x,y)中的求值顺序是未定义的,而在函数g((x,y))中却是确定的先x后y的顺序进行求值。在g((x,y))中,函数g只有一个参数,即先对x进行求值,然后丢弃x的值,接着求y的值。