目录
一、数据类型
1.介绍
今天介绍的都是内置类型,自定义类型在后期相应的章节会单独介绍。
1.1.1 字符型
字符的英文单词是character,在C语言中使用char表示字符型。
char
signed char //有符号
unsigned char //无符号
1.1.2 整型
整数的英文单词是integer,在C语言中使用int表示整型。整型主要分为四类,分别为short int,int,long int,long long int。在第一、三、四类中,int可以省略不表示。在这四类中signed都可以省略。
//短整型
short int
signed short int
unsigned short int
//整型
int
signed int
unsigned int
//长整型
long int
signed long int
unsigned long int
//更长的整型
long long int
signed long long int
unsigned long long int
1.1.3 浮点型
主要分为三类,单精度浮点型:float,双精度浮点型:double,精度更高的浮点型:long double,原则上long double的长度比double更大。
一般输入浮点数默认为double类型。
float //单精度浮点型
double //双精度浮点型
long double //精度更高的浮点型
1.1.4 布尔类型
C语言中最开始没有为布尔值单设一个类型,而是用0表示假,非零值代表真,后来在C99中引入了布尔类型,专门表示真假。使用时必须包含头文件<stdbool.h>,布尔值的变量取值是:true或者false。
_Bool
接下来,我们用具体的代码来体会布尔类型的运用。
_Bool这样的数据类型命名和之前的int、double非常不一致,不仅添加了下划线还需要大写,为了使用方便,也可以用bool表示。
2.各种数据类型的长度
每一种数据类型给都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,存储的数据范围也会有所不同。
1.2.1 sizeof操作符
sizeof是一个关键字,既可以计算变量长度也可以计算数据类型的长度,也可以是表达式。计算的结果单位是字节。sizeof的返回类型是size_t,要打印sizeof计算的值,打印格式应该为%zd。
在计算变量的时候,可以省略sizeof后面的()
接下来,我们从具体的例子来分析体会sizeof的具体用法。
在第一个例子中,变量里面存储的就是整型数据,占四个字节。第二个例子是第一种的另一个表示方法,计算结果相同。int类型占四个字节,这点与前面两个例子相互印证。
值得关注的是最后两个例子。
在倒数第二个例子中,计算了一个表达式的长度,前一个数字是int整型,后一个数字是double类型,两个不一致,最后计算结果会用较大的数据类型覆盖较小的数据类型,所以最后的计算结果是double所占的8字节。
在最后一个例子中,没有加括号来表示计算范围,sizeof默认计算的是数据3所占的字节数,int类型占4个字节,在加上数字5,则表示9,关键在于,没有计算数字5的长度而把他仅仅作为5来使用。
**返回类型是size_t怎么理解?
**C语言中只规定sizeof的返回值是无符号的整型,但是无符号的整型还有很多种,例如:signed short int,signed int,signed long int,signed long long int。他们的占位符各不相同,不好统一,不符合程序的可移植性。所以创建了一个类型别名size_t,用来统一sizeof的返回值类型。**
1.2.2 数据类型的长度
我们可以通过sizeof来计算各个数据类型的大小。
C语言标准规定:sizeof(long)>=sizeof(int),long整型既可能4字节也可能是8字节。为了防止数据溢出,经常会使用long long数据类型。同样的,long double也有可能表示16个字节。
**字节怎么理解?究竟是多大?
一个字节表示是八个比特位。计算机识别的是二进制,是数字1和0,每个数字占一个比特位。**
1.2.3 sizeof表达式不计算
sizeof里面的表达式不会真实计算,而是只会计算大小。
我们通过一个例子来体会。
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%zd", sizeof(s = b + 1));
printf("%d", s);
return 0;
}
s是short int类型,占2个字节,b是int类型,占4个字节。当大类型的数值强行赋值在小类型中,会大的数据类型会被截断,以小类型为主。
按照之前的逻辑,后一个数字应该输出11,但是由于sizeof里面的表达式不计算,所以s里面的数值还是2。
3.signed和unsigned
这两个关键字用于修饰字符型和整型数据类型。
signed:有符号的,可以存放正数,也可以存放负数和0。
unsigned:无符号的,该类型不带有正负符号,只能表示0和正整数。
在表示特定的数值时,比如年龄、人数的数据,只能是正数,更加方便与严谨。同时使用signed,同样长度的内存能够表示最大的整数类型增长了一倍。比如,16位的signed short int的取值范围是-32768-32767,而unsigned short int的取值范围是0-65535。
signed int == int但是signed char == char这是不确定的,这取决于编译器。
4.数据类型的取值范围
每一种数据类型的都有自己的取值范围,也就是存储的最大值和最小值。在头文件<limits.h>中说明了整型类型的取值范围,<float.h>中说明了浮点类型的取值范围。
在软件everything中可以查看这些头文件的内容,这是下载链接:下载 - voidtools,大家可以动手实操一下。
二、变量
1.变量的创建
数据类型是为了创建变量服务的,C语言中把经常变化的量称为变量,不变的值称为常量。
变量的创建需要前者为数据类型,后者为变量名,中间空格隔开。
data_type name;
- 变量命名的一般规则:
- 只能由字母(包括大写小写)数字和下划线组成
- 不能以数字开头
- 变量名中区分大小写
- 变量名不能使用关键字
在创建变量的同时直接赋值是变量的初始化。
变量创建的本质是在内存中开辟一个空间。我们在看看内存的状态,后期再详细介绍。
2.变量的分类
主要分为全局变量和局部变量。
全局变量:在大括号外部定义的变量,使用范围更广,在整个工程中都可以使用。
局部变量:在大括号内部定义的变量,使用范围比较局限,只能在自己所在的局部范围使用。
**全局变量和局部变量的名字相同时? 我们用一个例子来体会。
**
#include <stdio.h>
int num1 = 100;
int main()
{
{
int num1 = 200;
printf("%d", num1);
}
return 0;
}
输出的数据究竟是100还是200?
答案是200,当同名时,局部变量优先使用。**