C介绍与数据类型
# C语言介绍
# 简介
C语言是一款编译型语言,常用于嵌入式开发或实现一些比较小型的功能,因为C语言是面向过程的语言,而目前大型项目一般使用面向对象语言进行开发。虽然C语言相对于其他主流高级语言安全性、复用性、可读性要差些,但C语言由于其运行效率高、文件体量小、可移植性,所以仍然常被用于嵌入式开发、或者实现一些过程比较线性的功能。
# 程序开发过程
确定目标
在程序开发过程中,我们应当先用书面化的方式,确定我们要实现的目标,要做什么样的功能,需要输入输出哪些信息。
设计程序
在编写代码之前,我们还应当设计如何实现我们的目标,窗口如何展示,如何组织程序,目标用户是谁,要花多长时间完成,如何表示和处理数据等。
编写代码
编写代码实际就是用C语言语法去定义我们要做的事情,编写的C代码一般保存在拓展名为.c的文件中,在编写代码的过程中,我们应当尽量写一些简短但易懂的注释,以保证维护过程中不会忘记这样做的理由。
编译
编译是将代码源文件翻译成计算机能动的机器语言的过程,C语言代码本身对于计算机是无意义的,只是一个个的字符串,只有编译后的机器语言代码,才能被计算机识别并执行。
运行程序
编译好之后,我们就可以运行我们的可执行文件。
测试调试
在程序运行过程中,可能会发生一些意料之外的报错,此时就需要进行调试,并修改维护代码,使程序符合原本的预期。
维护修改
在需要对功能进行拓展或者更新时,都会维护更新代码。
# 程序编译过程
程序的编译一般会经过几个过程,首先我们需要执行编译器程序,来讲源代码编译成目标代码,也就是我们源代码对应的机器语言。 但编译后的目标代码实际只包含了源代码本身的机器代码,我们想要让程序变为可执行文件,还需要借助链接器,来将目标代码和启动代码和库函数代码进行合并,合并之后的文件,才是我们想要的可执行文件。
启动代码启动代码充当着程序和操作系统之间的接口,每个操作系统的启动代码都不一样,因为这些系统处理程序的方式不同。 库函数代码是源代码中使用到的库中的函数的机器代码,只有将用到的库函数的代码也合并进程序,程序才能正常的执行所调用的函数。在链接的过程中,没有被调用的函数会被丢弃。
# C语言基本语法
# 头文件
在C语言中,也会以库的方式封装去对函数进行封装,在使用时直接导入库,即可使用库中相关的功能。 C语言也不例外,C语言的库文件又被称为头文件,一般定义在源文件的头部位置,C语言的头文件名以".h"拓展名结尾。
引用头文件的格式如下:include <头文件名.h>
# 注释
单行注释:// 我是一行注释
多行注释:/* 我是多行注释,但也可以用于单行 */
# 变量
程序运行过程中会发生改变或被赋值的数据叫做变量,变量用于记录会变化的量,可以先对变量就行声明再去赋值,也可以声明时直接赋值。另外声明的变量名已存在会报错。
// 定义一个int类型的变量
int num;
// 给已声明的num变量进行赋值
num = 10;
// 一次声明多个同类型变量
int a, b, c;
a = 1;
b = 2;
c = 3;
// 声明变量时赋值
int one = 1;
int two = 2, three = 3;
2
3
4
5
6
7
8
9
10
11
12
13
14
# 常量
事先预定义,且在程序运行过程中不会有变化的数据叫做常量。
# 符号常量
符号常量又称为宏定义、明示常量,是一种会在预编译阶段对源代码进行值替换的常量。预编译时,编译器会先将源代码中所有引用了符号常量的地方替换为其所指定的值,然后再继续编译。因此程序运行过程中它们不占用内存空间,且不能改变的。 定义符号常量的方式,在源代码开头使用"#define NAME value"格式进行定义,不用指定类型,因为他们只是用于替换,例如:
#include <stdio.h>
// 常量名大写是一种规范
#define PI 3.14159
#define TEXT "Hello, world!"
int main(void) {
printf("%f\n", PI);
printf("%s\n", TEXT);
}
2
3
4
5
6
7
8
9
10
另外C头文件limits.h和float.h库提供了与整数类型和浮点类型的大小限制相关的详细信息,它们以符号常量的形式定义,需要用到时可以进行导入引用。
# 常变量
常变量是在程序运行过程中定义的,它会占用内存空间,但它是只读的,其值声明后无法改变。 定义常变量的方式,在变量定义前面加上const限定符即可,常变量必须在声明的同时进行赋值,例如:
#include <stdio.h>
int main(void) {
const float PI = 3.14159;
printf("%f", PI);
}
2
3
4
5
6
# C语言数据
# 数据类型
数据类型是用于定义数据如何在内存或硬盘中进行存储的,不同的数据类型存储方式不同、占用空间不同、用处也不不同,C语言中有整数和浮点数两大数据类型,以及一些其他类型。 整数类型:
int
- 有符号基本整数类型,占用空间依计算机字长而定,16位系统中为16位(2byte)、32/64位系统中为32位(4byte)。long
- 有符号长整数类型,占用空间依计算机字长而定,16/32位系统中为32位(4byte)、64位系统中为64位(8byte)。short
- 有符号短整数类型,固定占用16位(2byte)大小空间。long long
- 有符号长整数类型,固定占用64位(8byte)大小空间。char
- 有符号字符类型,用于存储单个字符或较短的数值,固定占用8位(1byte)大小空间。传入字符到字符类型需要使用单引号扩起。unsigned
- 无符号基本整数类型,占用空间同有符号。unsigned long
- 无符号长整数类型,占用空间同有符号。unsigned short
- 无符号短整数类型,占用空间同有符号。unsigned long long
- 无符号长整数类型,占用空间同有符号。unsigned char
- 有符号字符类型,占用空间同有符号。void
- 空类型。_Bool
- 布尔类型,占用1位大小空间,1表示true、0表示false。_Complex
- 复数类型。_Imaginary
- 虚数类型。
有符号整数取值范围计算方法:例如占用空间为16位,则取值范围为-(2^16/2)到(2^16/2)-1,也就是-32768~32767 无符号整数取值范围计算方法:例如占用空间为16位,则取值范围为0到(2^16)-1,也就是0~65535
浮点类型:
float
- 单浮点类型,固定占用32位(4byte)大小空间。double
- 双精度浮点类型,固定占用64位(8byte)大小空间。long double
- 长双精度浮点类型,16位系统中为64位(8byte)、32位系统中为96位(有效位10byte,但为了对齐实际占用12byte)、64位系统中为128位(有效位10byte,但为了对齐实际占用16byte)。
# 位、字节和字
在计算机中,最小的存储单位为位(bit),可以表示2种可能,也就是0和1。 然后是字节(byte),一个字节是8个位,可以表示256种可能,也就是0~255的整数或一组字符。 字是计算机中能够被处理和存储的最小单位。字长不同,单次能处理的数据也不同,例如现在64位的计算机,一个字长为64位,表示一次性能够处理64位的数据。计算机的字长越大,其数据转移越快,允许的内存访问也更多。
# 类型大小函数
sizeof();
可以用来获取数据指定数据类型的占用字节大小、也可以用来获取数组大小,例如:sizeof(int);
,另外输出sizeof函数的结果需要使用%zd格式符号。