一:C语言常见概念
1.认识C语言:
C语言是人和计算机交流的语言
C语言是一门面向过程 的语言,而C++,Java,Python等是一门面向对象的语言
软件开发(项目):面向过程+面向对象
操作系统(Windows,Linux等) 系统编程
计算机网络 网络编程,网络协议
数据库(MySQL
)
数据结构与算法
2.C语言的历史:
C语言最初是作为Unix系统的开发工具而发明的
Unix系统是开源的操作系统 --> Linux操作系统
1969年发明了B语言 -- 1972年C语言现世 -- 1973年Unix系统使用C语言重写(在此之前Unix系统是用汇编语言写的) -- 1988年美国国家标准协会(ANSI)正式将C语言标准化
3.编译器:
一:编译和链接:
1. C语言是一门编译型计算机语言,其源代码都是文本文件,本身无法执行,必须通过编译器的翻译和链接器的链接,生成二进制的可执行文件(++计算机能够识别的是二进制的指令++),才可执行。
2. C语言需要依赖编译器将计算机语言转换成机器能够执行的机器指令
3. C语言代码是放在 .c 文件中的,想要得到最终运行的可执行程序,中间要经过编译和链接的2个过程
4. C语言把 .c 为后缀的文件称为源文件 ,把 .h 为后缀的文件称为头文件
二:集成开发环境(IDE):用于提供程序开发环境的应用程序,一般包括代码编辑器,编译器,调试器和图形用户界面等工具。集成了代码编写功能,分析功能,编译功能,调试功能等一体化的开发软件服务套
一个工程一般都会有多个源文件组成: 如下图:
注意: 1. 每个源文件 .c 单独经过编译器 处理生成对应的目标文件(.obj为后缀的文件)
2. 多个目标文件和库文件经过链接器 处理生成对应的可执行程序(.exe文件)
4.第一个C语言程序:
c
#include <stdio.h>
int main()
{
printf("Hello C语言!!!");
return 0;
}
代码运行的快捷键:CTRL + F5
代码调试:F10
字体大小调节:CTRL + 鼠标滚轮
代码注释:CTRL + K + C
取消代码注释:CTRL + K + U
注意: 1. 一条语句结束后要有分号
2. 代码中不能使用中文符号
3. 项目名称最好要见名知意,不要使用中文,不要使用特殊字符,不要使用空格
5.main()函数:
每个C语言程序不管有多少行代码,都是从main()
函数开始执行的,main()
函数是程序的入口,因此,main()
函数也被叫做主函数
main()
前面的int
表示main()
函数执行结束的时候返回一个整数类型的值
所以,在main(
)函数的最后写return 0;
正好前后呼应
main()
函数是程序的入口main()
函数有且仅有一个- 一个项目中可以有多个 .c 文件,但是只能有一个
main()
函数(因为程序的入口只能有一个)
6.库函数:
为了不再重复实现常见的代码,让程序提升开发效率,C语言标准规定了一组函数,这些函数再由不同的编译器厂商根据标准进行实现,提供给程序员使用。这些函数组成了一个函数库,被称为标准库 ,这些函数也被称为库函数,在这个基础上一些编译器厂商可能会额外扩展提供部分函数(这些函数其它的编译器不一定支持)
一个系列的库函数一般会声明在同一个文件中,所以库函数的使用,要包含对应的头文件
7.关键字:
C语言中有一批保留名字的符号,这些符号被称为保留字 或者关键字
- 关键字都有特殊的意义,是保留给C语言使用的
- 在创建标识符变量的时候是不能和关键字重复的
- 关键字也是不能自己创造的
C语言的32个关键字:
注意: 在 C99 标准中加入了 inline
,restrict
,Bool
, Comploex
等关键字,不过使用最多的还是上面的32个关键字
8.字符和ASCII编码:
在键盘上敲出的各种符号,如:a
,k
,@
,#
,5
等,这些符号都被称为字符 ,在C语言中字符是用单引号 括起来的,如:'a'
,'k'
,'@'
,'#'
,'5'
等
在计算机中所有的数据都是以二进制的形式存储的,而我们给每一个字符所编写的二进制序列,这个就叫做编码 ,后来,为了方便大家相互通信,不造成混乱,美国国家标准协会(ANSI)出台了一个标准ASCII编码,将键盘上敲出的所有字符都进行了固定的编号,C语言中采用字符就遵循了ASCII编码的方式
ASCII编码表:
- 字符A~Z的ASCII编码值是从65~90
- 字符a~z的ASCII编码值是从97~122
- 对应的大小写字符(a和A)的ASCII编码值的差值是32
- 数字字符0~9的ASCII编码值是从48~57
- 换行\n的ASCII编码值是:10
- 在这些字符中ASCII编码值0~31的这32个字符是不可打印字符,无法显示到屏幕上观察
c
//将字符32~127这些可打印字符在屏幕上打印出来
#include <stdio.h>
int main()
{
int i = 0;
for(i = 32;i <= 127;i++)
{
if(i % 16 ==0)
printf("\n");
printf("%c",i);
}
return 0;
}
注意: 1. 字符的打印格式使用占位符 %c
来指定
2. 要想表示字符一定是要单引号括起来的
9.字符串和\0:
C语言中使用双引号 括起来的一串字符就被称为字符串 ,如:"乔越"
字符串的打印格式使用占位符 %s
来指定
++双引号引起来的叫字符串,单引号引起来的才叫字符++ ,字符串是一串字符,里面是由一个或者多个字符组成的,也可以没有字符,当里面一个字符都没有的时候,叫做空字符串
汉字是占两个字符的,所以单引号不能包裹汉字,只能包裹单个字符,而双引号可以包裹汉字
打印字符串有两种方式:
c
//第一种:
#include <stdio.h>
int main()
{
printf("haha\n");
return 0;
}
c
//第二种:
#include <stdio.h>
int main()
{
printf("%s","haha");
return 0;
}
C语言字符串中在字符串的末尾还隐藏着一个字符\0,这个\0是字符串的结束标志
例如: 字符串"abcdef"
,实际上看到的是6个字符:'a'
,'b'
,'c'
,'d'
,'e'
,'f'
但是实际上在其末尾还隐藏一个 \0 的转义字符,\0是字符串的结束标志 ,所以在使用库函数printf()
打印字符串或strlen()
计算字符串长度的时候,遇到 \0 就自动停止了
C语言也可以把一个字符串放在一个字符数组中(数组就是一组数据):
c
#include <stdio.h>
int main()
{
//C语言中用char类型来表示字符
//char qwe[3];//表示这个数组里面可以放3个字符
//char qwr[5];//表示这个数组里面可以放5个字符
char qwe[] = "abc";//这个的里面有\0
char qwr[] = {'a','b','c'};//这个的里面没有\0
printf("%s\n",qwe);//正常输出
printf("%s\n",qwr);//会出现乱码
return 0;
}
图示:
注意: 因为qwe
遇见\0就终止运行了,所以打印的结果只有a,b,c,而qwr
后面没有\0终止,所以会继续往下运行,直到遇见\0终止打印,所以打印结果会有其它内存空间的内容
c
#include <stdio.h>
int main()
{
char qwr[] = {'a','b','c','\0'};
printf("%s\n",qwr);//输出正常,不再出现乱码
return 0;
}
c
#include <stdio.h>
int main()
{
char asd[] = "abc\0def";
printf("%s\n",asd);//只会打印abc,因为后面遇到了\0终止
return 0;
}
库函数
strlen()
:用来返回一个字符串的长度
c
#include <stdio.h>
#include <string.h> //strlen库函数的头文件
int main()
{
int len = strlen("abc"); //用int类型的变量去接收,然后返回这个字符串的长度
printf("%d\n",,len);
return 0;
}
注意: 上述代码会出现警告,因为strlen()
返回的类型本质是size_t
,而size_t
这个类型是专门用来接收求长度的函数的返回值的,并且在strlen()
这个库函数时要包含头文件
c
#include <stdio.h>
#include <string.h> //strlen库函数的头文件
int main()
{
size_t len = strlen("abc"); //用size_t类型的变量去接收,然后返回这个字符串的长度
printf("%d\n",,len);
return 0;
}
10.转义字符:
转义字符 -- 转变了原来意思的字符
例如: \n
是一个转义字符表示换行的意思,可以简单的理解为 \ 让n的意思发生了转变,n本来只是一个普通的字符,被 \ 转义为换行的意思
C语言中的转义字符:
转义字符 | 描述 |
---|---|
? | 在书写连续多个问号时使用,防止它们被解析成三字母词,在新的编辑器上无法验证了 |
\ ' | 用于表示字符常量 ' |
\ '' | 用于表示一个字符串内部的双引号 |
\ \ | 用于表示一个反斜杠,防止它被解释为一个转义序列符 |
\a | 警报,使终端发出警报声或出现闪烁,或者两者同时发生 |
\b | 退格键,光标回退一个字符,但不删除字符 |
\f | 换页符,光标移到下一页,在现代系统上,已经无法验证了,行为改成类似于\v |
\n | 换行符 |
\r | 回车符,光标移到同一行的开头 |
\t | 制表符,光标移到下一个水平制表位,通常是下一个8的倍数 |
\v | 垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列 |
\ddd | 字符的八进制表示形式,ddd表示1~3个八进制的数字 如:\130 -- 表示字符X |
\xdd | 字符的十六进制表示形式,dd表示2个十六进制的数字 如:\x30 -- 表示字符0 |
\0 | null字符,没有内容,用于字符串的结束标志,其ASCII编码值是0 |
c
#include <stdio.h>
int main()
{
printf("%c",'\'');// \':打印一个单引号
printf("%s","\"");// \":打印一个双引号
printf("C:\\test\\test.c");// \\:防止被转义
printf("\a");// \a:触发系统(蜂鸣器)警报
printf("abc\bdef");//会打印abdef,\b:将c删除,退了一格
printf("ab\tdef\tq\txxxxx");// \t:对齐到\t的宽度
return 0;
}
c
#include <stdio.h>
int main()
{
printf("%c",'\130');// 将130这个八进制数字转换为十进制数字:0*8**0+3*8**1+1*8**2=88,0乘8的0次方+3乘8的1次方+1乘8的2次方=88,而88在ASCII表上对应的字符就是X
printf("%c",'\x30');// 将30这个十六进制数字转换为十进制数字:0*16**0+3*16**1=48,0乘16的0次方+3乘16的1次方=48,而48在ASCII表上对应的字符就是0
return 0;
}
注意: 一个转义字符算是一个字符
当求字符长度的时候,如果有 \ 后面加上其它的字符的情况,那么也会被默认为是一个转义字符,虽然无作用,但会将它们算作成一个字符
c
#include <stdio.h>
#include <string.h>
int main()
{
size_t len = strlen("c:\test\123.c");
printf("%d\n",len); //最后的结果,字符数量是9.因为一个转义字符只能算是一个字符(\t;\123)
return 0;
}
c
#include <stdio.h>
#include <string.h>
int main()
{
size_t len = strlen("c:\te\st\123.c"); //答案也是9,因为C语言把\s整体当成了一个转义字符
printf("%d\n",len);
return 0;
}
11.语句和语句分类:
C语言的代码是由一条一条的语句构成的,C语言的语句可分为以下五类:
1. 空语句
2. 表达式语句
3. 函数调用语句
4. 复合语句
5. 控制语句
一:空语句
空语句是最简单的,一个分号就是一条语句,也就是空语句
空语句出现的地方是:这里需要一条语句,但是这条语句不需要做任何事,就可以写一个空语句
c
#include <stdio.h>
int main()
{
; //空语句
return 0;
}
二:表达式语句
表达式语句就是在表达式的后面加上分号
c
#include <stdio.h>
int main()
{
int a = 10;
int b = 0;
b = a + b; //表达式语句
printf("%d",b);
return 0;
}
三:函数调用语句
在函数调用的时候,也会加上分号,就是函数调用语句
c
#include <stdio.h>
int Add(int x,int y)
{
return x+y;
}
int main()
{
printf("haha\n");// 函数调用语句
int ret = Add(2,3);// 函数调用语句
return 0;
}
四:复合语句
复合语句就是代码块,一对大括号中的代码就构成一个代码块,也被称为复合语句
c
#include <stdio.h>
void print(int arr[],int sz)//函数的大括号中的代码也构成复合语句
{
int i = 0;
for(i = 0;i < sz;i++)
{
printf("%d",arr[i]);
}
}
int main()
{
int i = 0;
int arr[10] = {0};
for(i = 0;i < 0;i++)//for循环循环体的大括号中的就是复合语句
{
arr[i] = 10 - i;
printf("%d\n",arr[i]);
}
return 0;
}
五:控制语句
控制语句用于控制程序的执行流程,以实现程序的各种结构方式
C语言支持的三种结构:顺序结构;选择结构;循环结构
C语言有九种控制语句,可分为以下三类:
- 条件判断语句(分支语句):
if
语句;switch
语句 - 循环执行语句:
do while
语句;while
语句;for
语句 - 转向语句:
break
语句;goto
语句;continue
语句;return
语句
12.注释:
- 注释是对代码的说明,编译器会忽略注释,也就是,注释对代码没有任何影响
- 注释是给人(自己或者他人)看的
- 好的注释可以帮助理解代码,但不要过度注释,不写没有必要的注释
注释的两种形式:
c
第一种:
/*
我是第一种注释
我还是多行注释
*/
第二种:
//我是第二种注释,是单行注释
注意: 第一种的注释风格是不支持嵌套注释的,也就是注释里面还有一个这样的注释
;选择结构;循环结构
C语言有九种控制语句,可分为以下三类:
- 条件判断语句(分支语句):
if
语句;switch
语句 - 循环执行语句:
do while
语句;while
语句;for
语句 - 转向语句:
break
语句;goto
语句;continue
语句;return
语句
12.注释:
- 注释是对代码的说明,编译器会忽略注释,也就是,注释对代码没有任何影响
- 注释是给人(自己或者他人)看的
- 好的注释可以帮助理解代码,但不要过度注释,不写没有必要的注释
注释的两种形式:
c
第一种:
/*
我是第一种注释
我还是多行注释
*/
第二种:
//我是第二种注释,是单行注释
注意: 第一种的注释风格是不支持嵌套注释的,也就是注释里面还有一个这样的注释