目录
一、初识C语言
1、什么是C语言
- 计算机语言(C/C++/Java/Python等) :实现人与计算机交流的语言
汉语、英语、日语等:实现人与人之间交流的语言
- C语言广泛应用于底层开发,但也可用于上层软件开发(只是不擅长而已)
- ANSIC国际标准
为了避免各个开发厂商用的C语言语法产生差异而制定的(用来保证不同企业之间可以相互使用)
- 计算机语言的发展
机器语言(二进制由0/1组成)--->汇编语言---------------------->B语言---------->C语言
0001(此时用机器语言写代码的称为科学家)
1001---------->此时假设1001代表的是add,称add为助记符
低级语言----------------------------------------------------------------------------------->高级语言
- C语言是面向过程的计算机编程语言
- 学习过程中主要的编译器
Clang(用于刷题)/GCC(Linux)/MSVC(vs)
2、第一个C语言程序
- vs使用步骤
创建项目(使用英文名称)--->创建源文件(无c语言选项使用c++)--->写代码
![第一步创建项目](https://i-blog.csdnimg.cn/blog_migrate/6ae52effc8a5beeccf1ed4c2f9ed3539.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4c89f7d3e9a85a9e03540e0852102631.png)
![](https://i-blog.csdnimg.cn/blog_migrate/316083df466f942edae295248ba8315c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d94358e03e1678b98bfe02c8230777fa.png)
![](https://i-blog.csdnimg.cn/blog_migrate/08831f78eb1e4d5abc007616ab1ed822.png)
- 源文件:.c文件
头文件:.h文件
- 快捷键:
Ctrl+F5---编译+链接+运行
F5---------会出现一闪而过的情况(有的编译器)
- main函数(主函数):
有且仅有一个(必须要有一个),且在一个工程中也只能有一个
老式写法为void main,现在大都改为int main
程序执行从main函数开始执行
- 库函数:使用库函数就要包含对应的头文件
printf函数:标准输出函数
scanf函数:标准输入函数
scanf("%d%d",&a,&b),若输入成功一个则返回1,输入成功两个则返回2,输入失败返回EOF(-1)(文件结束标志)
-
示例
3、数据类型
- 计算机单位
bit(比特):一个二进制位(0/1)
byte(字节):1byte = 8bit
KB(千字节):1KB = 1024byte
GB(吉字节):1GB = 1024KB
TB(太字节):1TB = 1024GB
PB(拍字节):1PB = 1024TB
- C语言内置类型:
(1)char:字符类型
(4)int:整型
(2)short:短整型
(4)long:长整型
(8)long long:更长的整型
(4)float:单精度浮点型
(8)double:双精度浮点型
- 不同的地方使用恰当的类型可以达到节省空间的效果(决定了为变量开辟空间的字节数)
例如:年龄age,使用短整型short即可,仅仅需要占用2个字节的空间
- sizeof的使用
用来计算类型和变量的大小,sizeof(int)=4;
- 不同类型对应的不同符号
字符型:%c
整型:%d
短整型:%hd
长整型:%ld
更长的整型:%lld
单精度浮点型:%f
双精度浮点型:%lf
4、变量和常量
- 变量:用来描述变化的数据
常量:用来描述不变的数据
- 定义变量的方式
short age = 15;
float weight = 55.5f;(55.5默认为double类型,加上f使其类型变为float)
char ch = 'c';(单引号--字符;双引号--字符串)
- 变量的分类:全局/局部
全局变量:在大括号之外定义的
同一项目的,其他文件中的全局变量不可直接使用,要加声明外部符号extern int 名称;
局部变量:在大括号之内定义的
- 当全局变量和局部变量中有相同名称的变量时:
若都可以使用的话,保持局部优先原则
- 变量的作用域和生命周期
作用域:变量可以使用的范围
局部变量:变量所在的局部范围
全局变量:整个工程
生命周期:创建到销毁之间的一个时间段
局部变量:进入作用域生命周期开始,出作用域生命周期结束
全局变量:整个程序的生命周期
- 初始化
全局变量不初始化默认为0
局部变量不初始化默认为随机值
5、常量
- 字面常量:可以直接写出来的,其中"abcd"为字符串常量
- const修饰的常变量,只是具有常属性,但本质上还是变量
- #define定义的标识符常量,命名时都为大写字母(无等于号;无分号)
- 枚举常量:可一一列举的(一种自定义类型的方法)
其中若使用printf("%d",red);//则此时打印结果为0
使用示例:enum Color ch = red;
6、字符串
- 字符串:由双引号引起来的一串字符
- 字符串的结束标志:\0(转义字符)
- 区分arr1和arr2的不同,arr1中末尾默认添加\0,且多占用一个字符长度,arr2则没有。
导致用%s打印时出现不同,有\0正常打印,无\0则不可正常打印,因为不知在何处停止打印
导致用strlen()函数计算长度时出现不同,有\0正常计算,无\0则不知计算到何处为随机值
- 使用strlen()函数则需要使用头文件string.h
- 若在中间添加\0,则会在中间就提前结束
7、转义字符
- 转义字符本质上为字符,打印时使用%c
- 重要的转义字符:
\\:用来表示一个\字符
\':用来表示一个'字符
\":用来表示一个"字符
\t:水平制表符,等价于tab键位的使用
\n:换行符
\ddd:其中d为八进制数字,最多为三位,例如\130代表为大写X
\xdd:x为前缀必须要有,dd为16进制数字,无上限要求,例如\x42代表为大写B
- 记忆的一些ASCII
\0:0
0:48
A:65
a:97
- 其中在用到打印目录时:c:\code\test.c,其中的\要写为双\\才能正常打印
- 其中包含不可打印字符,并非所有字符均可打印
8、注释
- /* */ 以及 // 两种注释方式
/**/为C语言的注释风格,但是例如/*a /* b */ c */,并不会注释掉c中内容,因为存在此缺陷,所以引用//(C++注释风格)
9、选择语句
- 选择语句包含:
if else语句
switch语句
10、循环语句
- 循环语句包含:
while语句
do...while语句
for语句
11、函数
- 作用:简化代码,反复使用
12、数组
- 一组相同类型元素的集合
- 数组初始化的三种方式(上图)
- 其中数组长度不可为变量,只能为常量
但是在c99标准中增加了变长数组的概念,此时的数组长度可以为变量,但并非所有编译器均可(vs2022中不可用)
- 数组的输入输出要结合循环语句进行(for/while/do..while)
13、操作符
- 算术操作符
+ - * / %
- 移位操作符
<< >>
- 位操作符
& | ^
- 赋值操作符
= += -= /= &= ^= |= >>= <<=
- 单目操作符:只有一个操作数的操作符
! - + & sizeof ~ -- ++ * ()
单目操作符部分使用方式如上图所示。
其中非0为真,!5=0; !0=1;
其中++/--不要过于困难化,例如b=(++a)+(++a)+(++a),在不同编译器结果不同是错误代码
- 关系操作符
> >= < <= != ==
- 逻辑操作符
&& 逻辑与(一假为假)
|| 逻辑或(一真为真)
- 条件操作符
exp1 ? exp2 : exp3
(若exp1为真,则计算exp2,为假则计算exp3,2/3表达式只计算其中一个)
- 逗号表达式
exp1 , exp2 , exp3 ..
(b=(a=3+1,c=1+1,d=a-c)),则a=4,c=2,d=2,但是b的值=(d=a-c),只看最后一个
- 下标引用、函数调用和结构成员
[] 下标引用,运用于数组中,操作数:数组名+数组个数=2个
() 函数调用,例如Add(),操作数:函数名+未知个数参数=未知个(至少一个)
.
->
14、关键字
- C语言中本身存在的,不可以创造关键字
- auto
char / int / short / long / double / float / signed /unsigned
if / else / do / while / for / switch / case / break / continue / default
const / static / typedef / sizeof / union / enum / struct
goto / extern / return / void
volatile / register
- auto---自动存储变量
例如;auto int a = 5;,代表a是自动销毁的,经常用于局部变量
- typedef:类型重命名
typedef unsigned int unint;,此时unint具有无符号整型的功能
- register:寄存器,计算机的一种存储器,是集成到CPU上的
例如:register int num = 5;//推荐将num中的值放入寄存器中,但是因为寄存器空间较小,会经由编译器决定是否真正放入寄存器中
其中num是取不到地址的,因为若放入寄存器中了,就不再内存中了,只有在内存中才可以取到地址