数据类型

C语言提供了丰富的数据类型来描述各种数据。

使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述用数。

所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才

知道怎么操作数据
Image

下文中的[]表示可省略

字符型

1
2
3
char //character
[signed] char //有符号
unsigned char //无符号

整型

1
2
3
4
//短整型
short [int]
[signed] short [int]
unsigned short [int]
1
2
3
4
//整型
int
[signed] int
unsigned int
1
2
3
4
// 长整型
long [int]
[signed] long [int]
unsigned long [int]

浮点型

1
2
3
4
float  //单精度浮点数
double //双精度浮点数
long double //C99新引入

布尔类型

在C99中引入了布尔类型,表示真假

1
bool

布尔类型的使⽤得包含头⽂件

1
<stdbool.h>

布尔类型的取值为 true 或 false

1
2
#define false 0
#define true 1
1
2
3
4
5
6

bool flag = true;
if (flag)
{
printf("I like C \n");
}
Image

各种数据类型的的长度

每一种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变

量,变量长度的不同,存储的数据范围就有所差异。

sizeof 操作符

sizeof是一个关键字,,也是操作符,专门是用来计算sizeof的操作符数的类型长

度的,单位是字节(byte)。

Image

操作数可以是类型,也可是变量或者表达式。

1
2
sizeof(类型)
sizeof(表达式)
1
2
3
int a = 0;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
Image
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

int main()
{
// 每种数据类型所占的大小 单位是字节 byte
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}

Image

C语言中规定

1
sizeof(long) >= sizeof(int)

1.5.2 sizeof 中表达式不计算

sizeof在代码进行编译的时候,就根据表达式的类型确定了,类型的常用,而表

达式的执行却要在程序运行期间才能执行,在编译期间已经将sizeof处理

掉了,所以在运行期间就不会执行表达式了。

1
2
3
4
int a = 1;
short b = 2;
printf("%zd\n", sizeof(b = 1 + a));
printf("%d\n", b);


sizeof 的截断

1
2
3
4
int a = 1;
short b = 3;
printf("%zd\n", sizeof(b = 1 + a));

此处决定 sizeof 返回值的是 b ,发生了截断。

Image

sizeof 运算符的返回值,C语⾔只规定是无符号整数,并没有规定具体的类型,

而是留给系统自己去决定。

C语言提供了一个解决方法,创造了⼀个类型别名 size_t 用来统一表示 sizeof

的 返回值类型。

在 visual studio 中,用 %zd 来打印 sizeof 的返回值。

二、 signed和unsigned

C语言中 signedunsigned 关键字是修饰字符型和整数类型的。

signed关键字,表示一个类型带有正负号

unsigned关键字,表示一个类型不带有正负号,只能表示0和正整数。

对于 int类型,默认是带有正负号的,也就是说 int 等于 signed int

整数变量声明为 unsigned的好处是,同样长度的内存能够表示的最大整数值,

增大了⼀倍。

比如,16位的 signed short int 的取值范围是:-32768~32767,最大是32767

unsigned short int的取值范围是:0~65535,最大值增大到了65,535。

Image Image

上述图片是 visual studio 中的部分相关定义。

值得注意的是,C语言规定 char 类型默认是否带有正负号,由当前系统决定。

这就是说, char 不等同于 signed char , 有可能是 signed char ,也有可能是

unsigned char 。

在 visual studio 中 , 直接写 char 就是 signed char。

占位符

C 语言中的占位符(格式说明符)主要配合 printf、scanf 等输入输出

函数使用,以 % 开头,作用是告诉函数要处理的数据是什么类型。

常见数据类型

占位符 作用 对应数据类型
%d 输出 / 输入 十进制整数 int
%c 输出 / 输入 单个字符 char
%s 输出 / 输入 字符串 字符数组 char[]
%f 输出 / 输入 十进制小数 float / double
%p 输出 变量的内存地址 指针类型

变量和常量

生活中的有些值是不变的(比如:圆周率,性别,身份证号码,血型等等)

有些值是可变的(比如:年龄,体重,薪资)。

不变的值,C语言中用常量的概念来表示,变的值C语言中用变量来表示

定义变量的方法

1
data_type name;

在创建变量时赋予一个初始值是一个好习惯。

变量在创建的时候就给⼀个初始值,就叫初始化。

变量的命名

  • 只能由字母(包括大写和小写)、数字和下划线(_)组成。
  • 不能以数字开头。
  • 长度不能超过63个字符。
  • 变量名中区分大小写的。
  • 变量名不能使用关键字。

变量的分类

  • 全局变量:在大括号外部定义的变量就是全局变量

    全局变量的使用范围更广,整个工程中想使用,都是有办法使用的。

  • 局部变量:在大括号内部定义的变量就是局部变量

    局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。

1
2
3
4
5
6
7
8
9
10
int global = 2026;//全局变量
int main()
{
int local = 666;//局部变量

int global = 2024;//局部变量
printf("global = %d\n", global);
printf("local = %d\n", local);
return 0;
}
Image

当局部变量和全局变量同名的时候,局部变量优先使用。

变量的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
printf("输入第一个操作数:> \n");
scanf("%d", &num1);
printf("输入第二个操作数:> \n");
scanf("%d", &num2);
sum = num1 + num2;
printf("两个操作数的和为:%d\n",sum);
return 0;
}
Image
1
2
3
4
5
int a;
int main()
{
printf("%d\n", a);
}

一个局部变量没有初始化的时候默认值是随机值

一个全局变量没有初始化的时候默认值是0

当局部变量和全局变量同名的时候,局部变量优先使用。

算术操作符

C语言中为了方便运算,提供了一系列操作符,其中有⼀组操作符叫:算术

操作符。这些操作符都是双目操作符。

+ 和 -

用来完成加法和减法。

1
2
3
int x = 1;
int y = 1;
printf("%d\n", x + y);

*

用来进行乘法运算

1
2
3
4
5
6
7
int main()
{
int num = 5;
printf("%d\n", num * num);
return 0;
}

/

用来进行除法运算。

两端如果是整数,执行的是整数除法,得到的结果也是整数。

1
2
3
4
5
6
int num1 = 10;
int num2 = 5;
int num3 = 4;
int num4 = 3;
printf("%d\n", num1 / num2);
printf("%d\n", num3 / num4);


如果希望得到浮点数的结果,两个运算数必须至少有一个浮点数,这时C语

言就会进行浮点数除法。

1
2
int num1 = 10;
printf("%f\n", num1 / 2.5);

%

求模运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能

用于浮点数。

1
printf("%d\n", 10 % 3);


负数求模的运算结果正负由第一个操作数决定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   printf("%d\n", -11 % 3);
printf("%d\n", 11 % -3);
```
![](https://github.com/zeerxi/C-language-article/blob/main/images/C%E8%AF%AD%E8%A8%80%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%B8%8E%E5%8F%98%E9%87%8F/%E8%B4%9F%E6%95%B0%E6%B1%82%E6%A8%A1.png?raw=true)
## 赋值操作符 =
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个

值,这叫赋值。

比较简单不做演示。

# 单目操作符 ++、--、+、-

只有一个操作数的操作符被称为单目操作符。

## 前置 ++

```c
int a = 10;
int b = ++a;
printf("%d\n", a);
printf("%d\n", b);

前置 ++ 就是先加一 ,后使用

在这段代码里反应为 a 先自加等 1,再赋值给 b 。

后置 ++

1
2
3
4
int a = 10;
int b = a++;
printf("%d\n", a);
printf("%d\n", b);

后置 ++ 就是先使用 ,后 + 1

在这段代码里反应为 a 赋值给 b,再进行自加等 1 。

前置–

与前置++逻辑一样,只是变成了-1

1
2
3
4
int a = 10;
int b = --a;
printf("%d\n", a);
printf("%d\n", b);

后置–

与后置++逻辑一样,只是变成了-1

1
2
3
4
int a = 10;
int b = a--;
printf("%d\n", a);
printf("%d\n", b);

强制类型转换

在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,

形式如下:

1
(类型)
1
2
int a = (int)3.14;
printf("%d\n", a);