一、认识C语言
1、什么是C语言?
1)通俗说法:
语言,顾名思义是事物与事物对话的一种方式。就比如:中国人之间用普通话或方言交流,美国人之间用英语交流,德国人用德语交流,动物之间也有着交流的语言……而C语言是我们语计算机交流的语言之一。
2)C语言的特点和用途:
>简洁高效:C语言具有相对简单的语法结构和功能,可在底层直接访问计算机硬件,因而执行效率高。
>可移植性:C语言编写的程序通常可以在不同平台上编译运行,这使得它成为开发跨平台应用的理想选择。
>系统编程:C语言广泛用于系统软件、操作系统、编译器、驱动程序等的开发,因为它能直接访问硬件并提供了足够的灵活性和控制。
>嵌入式系统:由于其高效性和低级别控制能力,C语言在嵌入式系统、微控制器、嵌入式软件等方面被广泛应用。
>应用领域广泛:C语言不仅在系统级编程中有用,在游戏开发、应用程序开发和大型软件项目中也有着重要的地位。
3)语言特性:
>过程式编程:基于函数和模块化的编程范式,以函数为基本组织单元。
>结构化:具备结构化编程的特征,支持顺序、选择和循环结构。
>指针和内存管理:C语言提供了指针的功能,允许直接操作内存地址,但也需要程序员自行管理内存。
>标准库支持:C语言提供了丰富的标准库,如stdio.h、stdlib.h等,方便开发者进行输入输出、内存分配等操作。
2、C语言的发展史
1960年代初期
贝尔实验室:C语言最初由贝尔实验室的丹尼斯·里奇(Dennis Ritchie)在20世纪70年代初开发出来。在贝尔实验室,B语言是C语言的前身,由肯·汤普逊(Ken Thompson)和丹尼斯·里奇(Dennis Ritchie)开发,用于更好地支持Unix操作系统的开发。
1972年
C语言诞生:丹尼斯·里奇(Dennis Ritchie)在贝尔实验室正式发布了C语言。他设计C语言的目的是为了更好地编写Unix操作系统,使其更具可移植性。
1978年
《C程序设计语言》:丹尼斯·里奇与布莱恩·柯尼汉(Brian Kernighan)合作编写了经典的《C程序设计语言》,该书成为学习C语言的标准教材,广泛流传并对编程社区产生深远影响。
1980年代初
标准化:C语言逐渐成为广泛接受的编程语言,并开始被标准化。1983年,美国国家标准协会(ANSI)成立了一个委员会来制定C语言的标准。这个过程在数年后完成,并于1989年发布了ANSI C标准,通常被称为C89或ANSI C。
1990年代
C语言标准化进程:在ANSI C标准发布后,C语言标准持续演进。1999年发布了C99标准,引入了一些新特性,例如增加了新的数据类型和更强大的数学库支持等。
2000年代至今
C11标准:C语言标准化进程仍在不断发展。2011年发布了C11标准,增加了一些新的特性和改进,如多线程支持、泛型编程等。
3、c语言可以做什么??
C语言的应用领域非常广泛,它的高效性和灵活性使得它成为许多计算机领域的重要基础。它既可以用于底层系统开发,又可以应用于高级应用程序的开发,是学习编程的重要起点之一。它可以用于许多不同类型的计算机程序开发,包括但不限于以下几个方面:
1)系统编程和操作系统开发
操作系统:C语言被广泛用于操作系统的开发,包括Unix、Linux等。
驱动程序:编写硬件设备的驱动程序,与硬件直接交互。
2)嵌入式系统和硬件控制
嵌入式系统:用于编写嵌入式系统的底层代码,如微控制器、传感器等。
硬件控制:编写与硬件交互的程序,例如机器人、自动化系统等。
3)应用程序开发
游戏开发:C语言在游戏开发中被广泛使用,尤其是对性能要求高的游戏。
应用程序:包括各种类型的应用软件,例如文档处理、图形处理、工具软件等。
4)数据库系统和网络编程
数据库系统:开发数据库管理系统(DBMS)和数据库应用程序。
网络编程:用于编写网络通信相关的程序,例如服务器、客户端应用等。
5)科学计算和算法开发
科学计算:C语言在科学计算和数值分析方面被广泛应用,尤其是对计算性能有较高要求的领域。
算法开发:编写高效算法和数据结构,用于解决各种计算问题。
二、C语言基础知识
1、什么是C语言中的源文件和源程序??
1)在C语言中,源程序是指程序员编写的原始文本文件,其中包含了用C语言编写的源代码。这个源代码文件是以文本形式存储的,通常以 `.c` 为扩展名,这也就是源文件,这些文件包含了程序员编写的源程序,用于描述程序的算法、逻辑和操作步骤。源文件是程序的初始形式,它们需要经过编译器的处理,将源代码转换成计算机可以理解和执行的机器码或可执行文件。
2)编写源文件需要遵循编程语言的语法规则,包括正确使用关键字、变量、函数等,确保程序的逻辑正确性和可读性。一旦编写完成并通过编译器编译成功,源文件就可以生成可执行文件,可以在计算机上运行和执行相应的任务。
3)源程序是程序的初始形式,它包含了程序的逻辑结构、变量声明、函数定义等。通俗点来说源程序就是我们手写代码的地方,在你写代码后系统让你保存的文件或者在你运行的时候叫你保存的文件就是就是源文件。而一个源文件中可以包含多个源程序。(在术语中“源程序”和“源代码”通常用来指代相同的内容)
下面是图示介绍(以vs为例):
这里我右击左侧的源文件然后点击了添加新建项,之后就会出现中间的保存框(然后将程序取一个你们喜欢的名字,切记要将后缀改成’.c’因为我们写的是c语言程序,其实改不改都没多大关系,不改的话系统给你默认的后缀是’ .cpp ‘这是’ c++ ‘的后缀)而这个我们保存和添加的文件就是我们的源文件,点击添加之后我们就进入了以下界面,我们就可以在源程序(源代码)中编写我们的代码:
源文件中可以包含多个源程序(源代码)从而来实现我们想要的复杂的功能,下面我又添加在同一源文件中添加了一个源程序(源代码):
2、什么是头文件??
1)头文件说明:
在C语言中,头文件(Header File)是包含函数声明、宏定义、类型定义和其他需要在多个源文件中共享的代码片段的文件。头文件通常包含程序中某些函数、变量或数据类型的声明,但不包含实际的代码实现。头文件的目的是为了提供一种在多个源文件中共享代码的方式,以便避免重复编写代码,促进代码重用和维护。通常,头文件以 `.h` 作为文件扩展名,在C语言中广泛使用。
2)头文件的主要作用包括:
>声明函数和变量:提供函数原型(函数的声明而非定义)、变量声明等信息,使得其他源文件可以访问这些函数和变量,而无需重复编写代码。
>宏定义:定义常量、宏、条件编译指令等,用于提高代码的可读性和可维护性。
>数据类型定义:定义结构体、枚举、自定义数据类型等,方便在多个文件中共享特定的数据结构。
3)头文件的通俗说法:
头文件就像是一个柜子,柜子里面有着一些“说明书”,这些说明书记载着一些函数和他们的用途,还有数据类型的定义和一些特殊的规则。然后在源程序中我们要使用一些函数时必须将头文件给包含进程序,也就是将你想要的柜子写在源程序(源代码)中,将柜子(头文件)拉进源程序中得使用‘#include’或者‘#include“ ”’将柜子(头文件)给拉到你的源程序中,柜子(头文件)中有着很多的说明书就像在‘stdio.h’这个柜子里有着‘printf’函数和‘scanf’函数的使用说明书。而‘#include’我们可以看做一种方式,就像我们要使用电脑时,肯定要先按开机键,电脑才会打开。同理对于C语言我想用‘stdio.h’这个头文件中的函数时,我们也必须使用‘#include’这种方式将头文件包含进源程序中。
例如,一个头文件可能包含一些函数的声明和相关的常量定义,其他源文件可以包含这个头文件来使用这些函数或者常量,而不需要重新编写它们的声明。常见的系统头文件如 `stdio.h`、`stdlib.h`、`math.h` 等,它们包含了大量标准函数的声明和常用常量的定义,供程序员在开发时使用。下面我们以C语言的一个使用‘printf’函数的程序为例,‘printf’函数是‘stdio.h’这一头文件中的函数,在‘stdio.h’头文件中定义了‘printf’这一函数的作用:
这是引用了头文件的情况:
这是将头文件注释掉的情况(就相当于没写这句话):
运行后发现程序报错,说找不到“printf”这一标识符,就是说vs这个‘人’他不知道‘printf’这个东西怎么用,因为他找不到‘stdio.h’这个柜子(头文件)也就找不到‘printf’的说明书,就不能执行程序。(大家可能会问都有什么函数,都有什么作用?关于这个问题,我会另写一篇文章细细说明)相信通过上面的说明,大家都对头文件有了一定的了解,也明白了头文件的重要性。
4)头文件的两种包含方式:
在C语言中,包含头文件有两种方式:使用双引号引用自定义的头文件和使用尖括号引用系统提供的标准头文件。这两种方式在引用头文件时有一些区别:
1>. 双引号引用自定义头文件:
#include “header.h”
搜索路径:编译器首先会在当前源文件所在目录搜索引号中指定的头文件。如果未找到,它会继续搜索其他标准路径,但这不是编译器的首选路径。
适用性:一般用于引用自定义的头文件,即程序员自己编写的头文件。
2>. 尖括号引用系统提供的标准头文件:
#include
搜索路径:编译器首先会在标准的系统目录中搜索尖括号中指定的头文件。
适用性:一般用于引用系统提供的标准库头文件,比如 `stdio.h`、`stdlib.h` 等。
总体来说,这两种方式的主要区别在于搜索路径的不同。双引号引用适用于自定义头文件,尖括号引用适用于系统提供的标准库头文件。
3、预处理指令
1)预处理指令说明:
在C语言中,预处理指令是以井号(#)开头的指令,用于在编译之前对源代码进行预处理。这些指令在编译器实际编译代码之前执行,用于进行一些预处理操作,比如定义常量、包含头文件、条件编译等。
2)常见的预处理指令包括:
#include: 用于包含头文件,将一个文件的内容嵌入到另一个文件中。
#define: 用于定义宏,将一个标识符定义为一个值或一个代码片段。
#ifdef, #ifndef, #endif: 用于条件编译,根据条件是否满足来编译代码段。
#if, #elif, #else: 条件编译的更灵活的形式,可以根据表达式的真假编译代码段。
#undef: 用于取消宏定义。
#pragma: 编译器指令,用于向编译器发出特定的命令或控制编译过程的行为。
(之后我会写一篇细说各种预处理指令的文章,小伙伴们记得点赞、收藏加关注)
3)使用预处理指令的优点:
预处理指令允许开发者在编译之前对代码进行处理和优化,提高了代码的可读性、灵活性和可维护性,使得编程变得更加便捷。并且能够根据不同的条件编译不同的代码块,使得程序更加灵活和高效。
4、基本语法
1)、常量和变量:
1>常量:
在C语言中,常量指的是在程序运行过程中,其值不会改变的量或标识符。例如以下代码中0、5、6就是常量。其中数值常量就是数学中的常数(常数不会变的对吧,1不就是1吗,不会变成2吧)
#includeint main(){int sum = 0;sum = 5 + 6;printf("%d\n", sum);return 0;}
常用的常量有以下几种:
(1)整型常量:
整型常量是C语言中表示整数值的不可更改的值。它们是指定为整数的字面值,可以表示正数、负数或零。整型常量可以有不同的表示形式:
十进制:如 `10`, `25`, `-7`。
八进制:以 `0` 开头,如 `021` 表示十进制的 17。
十六进制:以 `0x` 或 `0X` 开头,后跟十六进制数字(0-9、A-F或a-f),如 `0xFF` 表示十进制的 255。
后面我会再出一篇文章细讲各种进制的转换的,记得点关注!)
在C语言中,整型常量的默认类型为 `int`,除非后缀指定了不同类型。例如,在常量末尾添加 `u` 或 `U` 表示 `unsigned int` 类型,在末尾添加 `l` 或 `L` 表示 `long int` 类型。例如:
int a = 10; // 十进制整数常量int b = 021;// 八进制整数常量int c = 0xFF; // 十六进制整数常量unsigned int d = 100u; // 无符号整数常量long int e = 100L; // 长整数常量
整型常量用于在程序中直接表示固定的整数值,并且在整个程序执行期间其值不会改变。(这里的你们就先知道有一个’unsigned’代表无符号类型,之后会细讲的,关注关注!)
(2)实型常量:
实型常量是指在C语言中用来表示实数的不可更改的值。实型常量可以是浮点数,用于表示小数值。
实型常量的表示形式包括:
>浮点常量(Floating-point Constants):以小数点形式表示的数值,可以包含小数部分和指数部分。例如,`3.14`, `0.005`, `-8.9`。
>指数形式:使用科学记数法表示,例如 `3.0e8` 表示 3 乘以 10 的 8 次方,’-345.34e-25’表示负的345.34乘以10的负25次方,0.23E-10表示0.23乘以10的负10次方。因为计算计在输入或输出是没法表示上标或者下标,所以就规定用字母e或E代表以10为底数的指数。注意:e或E之前必须要有数字,并且在e或E后面的数字必须是整数不能为小数,例如不能写成e3, 4e2.4等。
实型常量在C语言中默认类型为 `double`,表示双精度浮点数。如果需要表示单精度浮点数,可以在常量后面加上 `f` 或 `F`。
double a = 3.14;// 双精度浮点数常量double b = 2.5e-3;// 指数形式浮点数常量float c = 1.2f; // 单精度浮点数常量float d = -0.007F;// 单精度浮点数常量
实型常量用于直接表示浮点数值,在整个程序执行期间其值保持不变。
3)字符常量:
字符常量是C语言中表示单个字符的不可更改的值。它们用单引号括起来,并且通常代表ASCII码表中的字符。
一些常见的字符常量包括:
字母字符:`’A’`, `’b’`, `’C’` 等表示对应的字母。
数字字符:`’0’`, `’1’`, `’9’` 等表示对应的数字。
特殊字符:`’+’`, `’-‘`, `’*’`, `’/’`, `’=’`, `’!’` 等表示对应的特殊符号。
转义字符:例如,`’\n’` 表示换行符,`’\t’` 表示制表符,`’\”` 表示单引号本身。
在C语言中,字符常量由单个字符组成,并用单引号括起来。例如:
char a = 'A'; // 字符常量表示字母'A'char b = '5'; // 字符常量表示数字'5'char c = '+'; // 字符常量表示特殊符号'+'char newline = '\n' // 字符常量表示换行符
字符常量在程序中用于表示单个字符的固定值,其值在整个程序执行期间保持不变。(注意哈,是单个字符,不能写成‘ab’或者‘12’,只能是‘a’,‘b’,‘1’,‘2’。这里的转义字符比较多,并且有着他们各自的功能,我会单独出一篇讲转义字符的文章,记得点赞收藏加关注!!!)
(4)字符串常量:
字符串常量是C语言中用来表示文本序列的不可更改的值。它们是一系列字符组成的序列,以空字符 `’\0’` 结尾,表示字符串的结束。字符串常量通常用双引号括起来。
例如:
char str1[] = "Hello"; // 字符串常量表示"Hello"char str2[] = "12345"; // 字符串常量表示"12345"char str3[] = "C语言"; // 字符串常量表示"C语言"
在C语言中,字符串常量实际上是字符数组(上面代码中的char str2[] 就是定义了一个字符数组),每个字符都被存储在连续的内存位置上,并以空字符 `’\0’` 结尾。因此,字符串常量可以通过字符数组来表示和处理。
需要注意的是,字符串常量是不可更改的,意味着它们在程序运行时是只读的,无法通过赋值来修改其中的字符。要修改字符串内容,需要将字符串常量赋值给一个字符数组,并对字符数组进行操作。
char str[] = "Hello"; // 字符串常量赋值给字符数组str[0] = 'h'; // 正确,字符数组中的内容可以修改
但是,以下代码是不允许的,因为字符串常量是只读的:
char *ptr = "Hello";// 尝试修改字符串常量,不允许ptr[0] = 'h'; // 错误,字符串常量是只读的,不可修改
因此,在C语言中,字符串常量是一种不可更改的固定值,通常用于表示文本数据。(上述代码中出现的‘*ptr’ 是跟指针相关的知识,我们之后会讲到,这里大家先做一个了解,记得点赞、关注加收藏!!)注意:字符串常量是双撇号中的全部内容(不包括双撇号本身),比如上面代码中的“Hello”不能写成‘Hello’大家注意,单撇号内只能包含一个字符,双撇号内可以包含一个字符串。
(5)符号常量:
符号常量(也称为宏常量或宏定义)是在程序中定义的具有固定值的符号名称。它们在整个程序中被用作常量,可以提高代码的可读性和可维护性。
在C语言中,可以使用`#define`指令创建符号常量。它们在程序中被处理器预处理阶段进行文本替换,将符号名称替换为其对应的值。
#define PI 3.14159#define MAX_VALUE 100
在这里,`PI` 和 `MAX_VALUE` 都是符号常量。经过上面的指定后,这一文件从第二行开始所有的PI都代表3.14159,MAX_VALUE都代表了100,每当编译器遇到代码中的`PI`时,会将其替换为`3.14159`,而每当遇到`MAX_VALUE`时,会将其替换为`100`。(注意行末尾没有分号)
使用符号常量的好处:
>易读性和易维护性:通过使用符号常量,可以使用有意义的名称来表示常量值,使代码更易读,更易于理解和维护。
>可维护性和可变性:如果需要更改常量值,只需更改符号常量的定义即可,无需在程序中搜索和更改每个具体值。
float radius = 5.0;float area = PI * radius * radius; // PI被替换为3.14159,计算圆的面积
这种方式避免了在代码中多次写入常量值,减少了代码重复性,提高了代码的可读性和可维护性。
注意:要注意区分符号常量和变量,不要将符号常量看成变量。符号常量不占内存,只是一个临时的符号,代表着一个值,在预编译后这个符号就不存在了,故不能对符号常量赋新值。且为与变量名相区别,习惯上将符号常量用大写表示,如PI,MAX_VALUE等。
>为什么符号常量不占内存?
符号常量在编译阶段就被处理器替换为其对应的值。在程序编译时,预处理器会将所有的符号常量替换为它们的具体值,这个过程称为宏替换。因此,符号常量在程序运行时并不会占据内存空间。当你使用符号常量时,编译器会在编译过程中直接将其替换为对应的数值或表达式。这个替换是在编译阶段完成的,而不是在程序运行时。这意味着在生成的可执行文件中,不会有符号常量的内存分配。它们只是在编译时被替换为对应的值,所以不会占用运行时的内存空间。
2>变量:
在C语言中,变量是用于存储和表示数据值的一个名称。它实际上是程序中的一个内存位置,用于存储各种类型的数据,例如整数、浮点数、字符等。在运行期间,变量的值是可以改变的。下图中age是变量名,25是变量age的值,就是存储在变量age的存储单元中的数据
(变量名实际上是以一个名字代表的存储地址,的学习C语言的指针知识中我们会与数据的存储地址打交道的)
变量具有以下特点:
>名称:变量有一个唯一的标识符或名称,这个名称用于在程序中引用该变量。
>数据类型:变量在声明时需要指定其数据类型,例如整数类型(int)、浮点数类型(float)、字符类型(char)等。这决定了变量可以存储的数据种类和范围。
>内存位置:变量在计算机内存中有一个地址,用于存储数据值。这个地址在程序执行期间是固定的,但是其存储的数据值可以改变。
>赋值和操作:变量可以通过赋值操作来存储不同的值,并且在程序中可以对变量进行各种操作,如读取、修改和运算等。
>作用域:变量在程序中的可见范围是有限的,这称为变量的作用域。例如,在函数内声明的变量只能在该函数内部访问。
在使用变量之前,需要在程序中进行变量的声明,指定变量的名称和类型。例如:
int age; // 声明一个名为age的整数类型变量float temperature; // 声明一个名为temperature的浮点数类型变量char letter; // 声明一个名为letter的字符类型变量
在这个例子中,`age`、`temperature` 和 `letter` 分别是整数、浮点数和字符类型的变量。声明之后,可以通过赋值操作为变量分配具体的值:
age = 25; // 给age赋值为25temperature = 98.6; // 给temperature赋值为98.6letter = 'A'; // 给letter赋值为字符'A'
变量使得程序能够动态存储和操作数据,为程序提供了灵活性和可变性。
3>常变量:
在C语言中,常量是指其值在程序运行期间不能改变的数据。而常变量(constant variable)通常是指被声明为常量的变量,即程序中声明为常量的变量。
在C语言中,使用`const`关键字可以将变量声明为常量。声明为常量的变量在初始化后就不能再被修改其值。(我之后会写一篇有关关键字的文章,大家记得点赞关注加收藏!!!)例如:
const int x = 5; // 声明x为常量,其值为5,不能再被修改
在上述例子中,`x`被声明为一个常量,其值被设置为5,并且不能在后续的程序中被修改。试图对常变量进行赋值操作会导致编译错误。例如:
x = 10; // 这个操作会导致编译错误,因为x是常量,其值不能被修改
常变量的值在编译时就已经确定,并且在整个程序的执行过程中都不会改变。常变量通常用于存储在程序运行期间保持不变的值,例如数学中的常数(如圆周率 π),程序中的一些固定值或者常用的配置参数等。
(1)常变量与常量的异同:
相同点:
1. 值不可修改:无论是常变量还是常量,它们在程序运行期间的值都是不可修改的。
2. 用途:常变量和常量都用于存储在程序中值不变的数据,如固定的数值、配置参数等。
不同点:
1. 声明方式:常量是通过关键字 `const` 声明的,例如 `const int x = 5;`,而常变量则是指被声明为常量的变量,通过 `const` 关键字将变量声明为常量。例如 `int const y = 10;`。
2. 类型:常量可以是表达式的值(如 `const int result = 2 * 3;`),也可以是编译时确定的值(如 `const int daysInWeek = 7;`)。而常变量是指用 `const` 关键字修饰的变量,其值在初始化后不能修改。
3. 作用域:常量的作用域是全局的(如果在全局范围内声明),而常变量的作用域可以是全局的也可以是局部的,取决于其声明的位置。
(2)常变量与符号常量的区别:
1.声明方式:
常变量是通过 `const` 关键字声明的变量,而符号常量是通过 `#define` 预处理指令定义的名称。
2.内存占用:
常变量需要在内存中存储其值,而符号常量在编译时直接替换为对应的值,不会占用额外的内存空间。
3.类型差异:
常变量是具有类型的变量,而符号常量仅是编译时进行替换的符号,没有类型信息。
总的来说,常变量是具有类型的变量,在程序运行时其值不可更改;而符号常量是编译时进行替换的符号,用名称表示一个常数值。两者用途和定义方式不同,但都可以用于存储不可变的数据。
4>标识符:
在C语言中,标识符(identifier)是用来命名变量、函数、或其他用户自定义的项目(比如标签或宏)的名称。它们是程序中的命名,用于标识不同的程序实体。
标识符的命名规则:
1. 组成:标识符由字母(大写或小写)、数字和下划线组成。
2. 规则:
1>第一个字符必须是字母或下划线。
2>标识符区分大小写,因此大写字母和小写字母被视为不同的字符。
3>C语言中有一些保留的关键字(如 `if`、`while`、`int` 等)不能作为标识符。
一些有效的标识符示例:
– `variable`
– `myVar`
– `counter_1`
– `_result`
– `calculateSum`
一些无效的标识符示例:
-‘M.D.John’
-‘#33’
-‘3D64’
三、结束语
好了,以上就是本篇文章的主要内容了,要是文章内容有什么问题的话可以私信我,要是对文章内容的某个知识点有什么问题的话可以将问题放在评论区哦,相信评论区会有很多大神,要是你们还有啥想知道的内容的,也可以私信我!!!既然你都看到这了,那就点个赞,点个关注,点个收藏吧!!!你们的鼓励就是作者最大的动力。
下期预告:番外篇:各种函数的作用(常用)
(ε=(´ο`*)))唉没想到这个好难写啊,看来一个星期写一个主线还是有点困难的,我尽量一周一主线吧,最差也是两周一主线,番外的话会一周一篇或一周两篇的,这个应该行,主要是这个月事情太多了~~喜欢的小伙伴们别忘了期待关注!!!这里我要说一声抱歉,因为这个写作的我还没熟悉,所以排版上有点混乱,只能费一费你们的眼睛了,作者感到万分抱歉)