初识c语言
0.前言
简单了解c语言的基础知识,对c语言有大致了解,后续会更新每个知识点详细讲解。
1、什么是c语言
C语言是一门面向过程的、抽象化的通用计算机编程语言,广泛应用于底层开发。常用的编译器有GCC、MSVC。
2、编写c语言代码
工具:VS2019
步骤:创建项目、创建源文件、写代码
具体步骤如下:
首先打开VS2019编译器,点击“创建新项目”。
然后选中“空项目”,点击“下一步”。
可以根据自己需求修改“项目名称”和“位置”,“项目名称”最好不要包含汉语、特殊字符、空格等。修改完后点击“创建”。
项目创建成功后,接着创建源文件。在“资源管理器”栏中右击“源文件”,依次点击“添加”、“新建项”。
点击“c++文件”,因为我们编写c语言,所以文件名称后缀改为“.c”,最后点击“添加”。
创建源文件之后的界面如下所示,现在就可以在空白区域编写c语言代码啦。
接下来编写一小段代码,使用快捷键ctrl+f5运行代码。结果如下图所示。
3、变量和常量
变量是用来描述生活中变化的数据;
常量是用来描述生活中不变的数据。
3.1变量
3.1.1定义变量的方法
定义变量的基本格式为“数据类型 变量名”。例如:int age;
在定义变量时还可以为其赋值。例如:int year = 2023;
3.1.2变量的命名
变量名只能由字母、数字和下划线组成,但不能由数字开头。此外,变量名区分大小写,不能使用关键字。
3.1.3变量的分类
变量可分为局部变量和全局变量。在函数内部定义的变量为局部变量,只在本函数范围内有效;在函数外部定义的变量为全局变量,从程序开始到结束都有效。
当全局变量和局部变量同名时,优先使用局部变量。
3.1.4变量的作用域和生命周期
作用域:限定变量可用性的代码范围。
局部变量的作用域是变量所在的局部范围;全局变量的作用域是整个工程。
生命周期:变量从创建到销毁的时间段。
局部变量的生命周期从进入作用域开始,一直到出作用域结束;全局变量的生命周期是整个程序的生命周期。
3.2常量
3.2.1常量的几种形式
c语言中的常量分为以下几种:
字面常量、const修饰的常变量、#define定义的标识符常量、枚举常量
字面常量:c语言中通常使用字面常量对变量直接赋值。如下面代码中的“10”、“e”、“abcdef”都是字面常量。
int main() { int a = 10; char b = 'e'; char c[] = "abcdef"; return 0; }
const修饰的常变量:被const修饰的变量具有常属性,值不能再被改变,但本质上仍是变量。如图所示,变量n被const修饰后不能再被改变,具有常属性。
如图所示,即使n被const修饰,n本质上还是一个变量。
#define定义的标识符常量:使用#define定义一个标识符来表示一个常量,一般形式如下。
#define Max 100
枚举常量:枚举是c语言提供的一种可以自定义类型的方法,将变量的可能取值一一列举出来,这些可能取值被称为枚举常量。形式如下。
enum Sex { MALE, FEMALE, SECRET };
枚举常量默认有初值,第一个枚举常量默认值为0,第二个枚举常量默认值为1,……以此类推。
4、字符串和转义字符
由双引号引起来的一串字符称为字符串。字符串的结束标志为\0,隐藏在字符串后面。如果一个字符串中没有\0,则在打印该字符串时会出现错误。
int main() { char arr1[] = "abcdef"; char arr2[] = { 'a','b','c','d','e','f' }; printf("%s", arr1); printf("%s", arr2); return 0; }
在调试中可以看出,数组arr1中包含\0,而数组arr2中不包含\0。
从打印的结果来看,arr2的结果与预期值不符,因为只有遇到\0字符串才算结束,而arr2中没有结束标志\0,所以会一直打印,直到遇见\0。
转义字符是以‘\’开头的字符,后面跟一个或几个其他字符,将‘\’后的字符转变为其他的意义。
常用的转义字符如下:
在计算字符串长度时,注意观察字符串中是否包含转义字符,如果包含转义字符,则转义字符算作一个字符。例如下面这段代码中,\t、\234、\t都为转义字符,分别看作一个字符,所以字符串总长度为13。
int main() { printf("%d",strlen("c:\test\234\test.c")); return 0; }
5、注释
注释的使用场景如下:代码中有一些不必要的代码可以注释掉;还可以在代码中添加相应的注释,对代码进行解释说明。
注释方式有两种,一种是:/*xxxxxxxxx*/,一次可注释多行,但这种方式不能嵌套使用;另一种是://,一次注释一行,可以嵌套使用。
6、选择语句
选择语句包括if语句、switch case语句。其中,if语句分为单分支if语句、双分支if语句、多分支if语句。
7、循环语句
循环语句特点:在循环条件成立时,反复执行某程序段,直到条件不成立为止。循环语句包括while语句、do while语句、for语句。
8、函数
一个程序可由一个主函数和若干个函数构成。主函数调用其他函数,其他函数也可以相互调用,同一个函数可以被一个或多个函数调用任意多次。
9、数组
数组是一组相同类型元素的集合。数组通过下标来访问,数组元素的下标从0开始。
数组的定义:类型说明符 数组名 [常量表达式]
数组名为用户定义的数组标识符,常量表达式为数组元素的个数。
数组的初始化:类型说明符 数组名 [常量表达式] = {值,值,……,值}
如果给全部元素赋值,可以省略常量表达式;可以只给部分元素赋初值,其余默认初始值为0。
10、操作符
算术操作符:+ - * / %
/ 两个操作数都为整数时,结果才为整数,操作上中只要有一个小数,结果为小数。
%两个操作数必须为整数。
移位操作符:>> <<
<< 逻辑左移和算术左移相同,都是高位丢弃,低位补0
>> 逻辑右移高位补0,低位丢弃;算术右移高位补符号位,低位丢弃
位操作符:& | ^
位操作符的操作数必须为整数。
赋值操作符:= += -= *= |= %= >>= <<= &= ^=
单目操作符:! + - & ~ * sizeof ++ -- (类型)
!逻辑取反
& 取地址
~ 对一个数的二进制按位取反
* 解引用
sizeof 操作数的类型长度(以字节位单位)
(类型) 强制类型转换
关系操作符:> >= < <= != ==
逻辑操作符:&& ||
&& 逻辑与,左边为假,右边不用计算,结果一定为假
|| 逻辑或,左边为真,右边不用计算,结果一定为真
条件操作符:exp1?exp2:exp3
如果exp1为真,执行exp2;否则执行exp3
逗号表达式:exp1,exp2,……expn
从左向右执行,整个表达式结果是最后一个表达式结果
11、常见关键字
C语言提供了丰富的关键字,这些关键字都是语言本身预先设定好的,用户自己不能创造关键字。常见关键字有:auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、switch、typedef、union、unsigned、void、volatile、while
这里详细介绍一下static关键字。static可以用来修饰变量和函数。
(1)static修饰局部变量。一个普通局部变量被创建后放在内存中的栈区,而static修饰的局部变量被创建后放在内存中的静态区,使得变量出了作用域不会被销毁,改变了其生命周期,只有当程序结束后才会被销毁。
(2)static修饰全局变量。一个普通全局变量的作用域是整个项目工程,全局变量具有外部链接属性,在其他源文件内部使用时只需使用extern声明一下即可;而static修饰全局变量把外部链接属性变成了内部链接属性,改变了其作用域,只能在当前源文件中使用,其他源文件不能使用。
(3)static修饰函数。与全局变量类似,函数也具有外部链接属性,在其他源文件内部使用时只需使用extern声明一下即可;而static修饰函数把外部链接属性变成了内部链接属性,只能在当前源文件中使用,其他源文件不能使用。
12、#define定义常量和宏
#define定义常量基本形式:#define 标识符 常量
标识符为所定义的宏名,常量可以是常数、字符串等。
#define定义宏基本形式:#define 宏名(参数列表) 字符串
13、指针
为了有效使用内存,内存被划分为一个个内存单元,每个内存单元大小为1字节。而为了正确访问这些内存单元,为每个内存单元进行编号,这些编号就是内存单元的地址。地址指示了内存单元的位置,所以通常把这个地址称为指针。
在c语言中,允许用一个变量来存放指针,这种变量称为指针变量。在32位平台上,指针大小为4字节;在64位平台上,指针大小为8字节。
14、结构体
结构体,将不同类型的数据组合成一个有机的整体以便引用。声明一个结构体类型的一般形式:
struct 结构体名
{
成员列表;};