3.1 基本数据类型
在C语言中,仅有四种基本数据类型 —— 整型、浮点型、指针和聚合类型(数组、结构等)
3.1.1 整型
整型又包括字符型、短整型、基本整型和长整型,他们都分为有符号和无符号两个版本,规定:
长整型至少和基本整型一样长,而整型至少应该和短整型一样长。
字符型在本质上是小整型值,缺省的 char 可能是 signed,也可能是 unsigned,这取决于编译器,因此,只有当 char型变量显式声明为 signed 或 unsigned 时,才对其执行算数运算。
一、整型字面值(整型常量)
字面值是字面值常量的缩写,当程序内出现整型字面值时,它属于整型家族哪一种取决于字面值是如何书写的,并且可以在字面值后添加后缀来改变缺省规则,添加 L 或 l ,被解释为长整型。添加 U 或 u ,被解释为无符号整型,如果都添加,则被解释为无符号长整型。例如:
122L
整型可以用八进制表示,在数字前加0,也可以用十六进制表示,在数字前加0x。例如:
0173 0xFFFF
字符常量就是用单引号引起来的单个字符或转义字符或三字母词。例如:
'M' '\n' '\102' '??)'
二、const 常量(符号常量)
与普通变量极为相似,只是在他被初始化之后,值就不可以在改变。例如:
const double pi = 3.141592;
const 常量与宏常量相比,优点是能指出类型,比如上个例子中的 pi 是 double 类型
三、枚举类型
枚举类型指他的值为符号常量而不是字面值的类型。例如:
enum Jar { AB , CD , EF , GH , IJ }
首元素不附初值的话,默认为0,后一个元素不赋值的话,默认比前一个元素大1,这种类型的变量实际上是以整型的方式存储,这些符号名的实际值都是整型值。
宏和枚举的主要区别是作用的时间和存储形式不同。宏定义是在编译预处理阶段作用的,也就是在编译预处理时,就会进行宏替换,将程序中的所有宏名替换为所定义的常量名,而枚举则是在程序运行之后才起作用的。宏定义不分配内存空间,而枚举常量存储在数据的静态存储区中(这一点一定要注意)。宏只占用代码段的空间,而枚举除了占用代码段空间外,还耗费CPU资源。(关于宏我们在之后的预处理处再说)
3.1.2 浮点类型
浮点类型包括 float 、double 和 long double 类型,标准规定:long double 类型至少和 double 类型一样长。
浮点数字面值在缺省情况下都是 double 类型,除非在其后面有 L 或 l 后缀,表示为 long double 类型,或者跟一个 F 或 f ,表示为 float 类型。
3.1.3 指针类型
指针就是C语言为什么如此流行的重要原因。
变量的值存储于计算机的内存中,每个变量都占据一个特定的位置,每个位置都由地址唯一确定,指针只是地址的另一个名字罢了,指针变量就是其值为另一些变量的地址的变量。通过地址而不是名字来访问数据常常引起混淆,事实上并不应该搞混,比如门牌号来标识一个街道上的房屋,你不能把门牌号码和房子里的东西搞混。
我们可以把计算机的内存想象成一条街道上的一间间房子,每个房子用门牌号码唯一确定。即每个地址上都保存一个值,但是这个值和其地址值是独立且不同的,虽然都是数字…
一、字符串常量
C语言不存在字符串类型,但是提供字符串常量。字符串就是一串以 NUL 结尾的零个或多个字符。字符串通常存储在字符数组中,这也是C语言没有显式的字符串类型的原因。注意:字符串不包括 NUL 字符。例如:
"Hello" "Line 1\n Line2" ""
最后一个例子说明,字符串常量(不像字符常量)可以为空,但是内部依然存在 NUL 。
之所以把字符串常量放在这里,因为当在程序中使用字符串常量时后生成一个"指向字符的指针",当表达式中出现字符串常量时,使用的就是字符所存储的地址,而不是字符本身,因此,我们可以把一个字符串赋值给一个指向字符的指针,而不能赋值给字符数组(与初始化不同,可以初始化给一个字符数组),字符串常量的直接值就是指针,而不是本身。
如果觉得不能赋值或复制字符串不方便,C语言标准库函数给我们提供了函数,用于复制,连接,比较,计算字符串长度以及在字符串中查找特定字符的操作。(具体实现我们之后会说)