没有人喜欢孤独, 只是不喜欢失望罢了! 村上春树–<挪威的森林>
目录
编程语言 | C | 2. 数据类型
2.1 基本类型
2.1.1 整形类型
32位操作系统, ANSI标准下:
- (1) 基本整型 (int) 4Byte
- (2) 短整型 (short int) 2Byte
- (3) 长整型 (long int) 4byte
- (4) 双长整型 (long long int) 8Byte
- (5) 字符型 (char) 1Byte
- (6) 布尔类型 (bool)
#include <stdio.h>
int main(){
printf("%\n", sizeof(char)); // 1
printf("%\n", sizeof(short)); // 2
printf("%\n", sizeof(int)); // 4
printf("%\n", sizeof(long)); // 4
printf("%\n", sizeof(long long)); // 8
printf("%\n", sizeof(float)); // 4
printf("%\n", sizeof(double)); // 8
printf("%\n", sizeof(long double));// 8
return 0; // sizeof 是C语言中的运算符, 功能是告诉
} // 我们某个变量或者某个类型占了几个字节
数据类型:
char //字符数据类型 -128---+127 0-255 1个字节
short //短整型 -32768---+32767 0-65535 2个字节
int //整形 -21亿---+21亿 0-49亿 4个字节
long //长整型 4个字节
long long //更长的整形 8个字节
float //单精度浮点型 4个字节
double //双精度浮点型 8个字节
2.1.2 浮点类型
- 单精度浮点型 (float) 4Byte
- 双精度浮点型 (double) 8Byte
- 复数浮点型 (float_complex, double_complex, long_complex)
2.1.3 内存大小
- Bit–>Byte–>Kb–>Mb–>Gb–>Tb–>Pb
- 8Bit = 1 Byte, 1024 = 2^10
- 1G = 1024M = 1024 * 1024KB = 1024 * 1024 * 1024B = 2^30B = 1,073,741,824B (10亿)
2.1.4 总结
- 讨论不同类型的数据在内存中分配多少个字节是需要看操作系统的。
2.2 枚举类型 (enumeration), 空类型 (void)
2.2.1 enum
(1) 枚举的定义
enum 标识符
{
枚举数据表
}
注意事项
- enum是关键字,标识枚举类型,定义枚举类型必须用enum开头。
- 枚举数据表中的名字是程序员自己设定,这些名字只是一个符号。枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号隔开。
- 枚举数据表的值都是整数,第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1,也可以人为设定枚举成员的值,从而自定义某个范围内的整数。
- 可以在定义类型时对枚举常量初始化。
- 枚举类型可以进行比较。
- 枚举常量不是字符串,不能用%s方式输出字符串。
- 枚举型是预处理指令#define的替代。
(2) 枚举的使用
1. 一次定义多个变量
初始位置有值
#include<stdio.h>
enum week {Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};
int main()
{
printf("%d",Tue);
return 0;
}
- 像这样定义以后,Mon的值为1,Tue的值为2,Wed的值为3,Thu的值为4, Fri的值为5, Sat的值为6, Sun的值为6, 一次类推.就可以像使用define之后的常量一样的使用定义的7个值了。
初始位置的枚举变量不设值
- 如果开头不写Mon=1的话,Mon的默认值为0,然后从0开始增长。例如:
enum color {red,blue,green,yellow};
- 如果我们这样定义的话,red的值为0,blue的值为1,然后依次增长。
为中间某个位置的枚举变量设值
enum color {
red,
blue,
green=5,
yellow
};
- 那么red到blue是按照默认的从0开始增长的, 如果green的值定义为5,然后green之后的值都是从5开始增长的。
为每个枚举的变量赋值
- 当然你也可以为每个枚举的变量都赋值,这样就和全都用define定义是一样的了,如果枚举中有某个值没有被赋值,那么它将是从前一个赋值的变量开始,一次增加1。
2. 限定变量的范围
- 比如我们的应用程序中要处理有关月份的东西,显然月份只能取1-12中的某个数字,为了保证程序的正确性和健壮性,我们应该使用enum。
#include<stdio.h>
enum Month {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec};
int main()
{
enum Month a = Feb;
printf("%d",a);
return 0;
}
3. 使用enum定义的几种方法
(1) 在定义enum的同时, 声明变量
enum Month {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec} a,b;
- 这样就声明了两个枚举类型a和b。
(2) 定义完enum之后再声明变量
enum Month {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec};
enum Month a = Feb;
(3) 定义匿名的枚举变量
enum {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec} a;
- 这样的话, 只能使用a这一个枚举类型的变量,不能再定义其他的枚举类型。
(4) typedef enum则是用来定义一个数据类型, 那么该类型的变量值只能在enum定义的范围内取
typedef enum {Jan=1,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,dec} Day;
Day a, b;
总结
- 同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量!
2.2.2 void
(1) 定义
- void 中文翻译为"无类型",有的也叫"空类型",常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。
(2) 总结
- 如果函数没有返回值那么应声明为void 类型;C语言中有一个规则,凡是不加返回值限定的函数,就会被编译器作为整型值处理。
- 如果函数无参数,那么应该声明其参数为void;如果我们所写的函数不接受任何参数,那么一定要指明其参数为void;如果函数的参数可以是任意类型指针,那么应声明其参数为void。
- 按照C标准规定,我们不能对void型指针进行运算,对有类型的指针进行算法操作的时候我们知道,因为其有具体所指向的类型,也就是对其所指向的数据类型为单位进行的;而void为空或者说无类型,所以就无法对其进行算法运算。
- void 不能代表一个真实的数据类型,因为void在C语言中解释为空,或者无类型,所以它当然无法代表一个真实的数据类型了。不过我们可以对其进行类型转换,这样它又可以变成各种各样的数据类型,所以我们可以将其理解成一个"抽象数据类型"。