C语言项目:
1.词典
2.贪吃蛇游戏
1.C语言概述
机器语言
汇编语言
高级语言
2.C语言特点
优点:
代码量小
执行速度快
功能强大
编程自由
缺点:
写代码周期长
可移植性较差(相对于windows和linux来说的,因为不同平台下支持的POSIX协议不同)
过于自由,经验不足容易出错
对平台库依赖较多
3.为什么学习C语言?C语言的强大之处?
所有大学理工科必修课
高薪程序员面试必考
写外挂、黑客必须掌握的语言
学习数据结构/C++的基石
Unix/Linux/Windows/Java/C++/C#底层都是C语言实现的
4.C语言应用领域
网站后台
针对某个主题写出功能强大的程序库(.dll)
编写大型游戏引擎
封装成另一个语言
编写操作系统和驱动程序(只能C语言)
任何设备只要配置了微处理器,就都支持C语言
5.C语言发展方向
嵌入式(C+少量汇编)
WEB开发:JS/PHP/ASP/JSP(PHP是C开发的)
高性能服务:Apache/Nginx/Memcached/Redis/等高性能Web服务器都是C开发
分布式应用:Java/python
游戏服务器:C/C++/Lua脚本
并行计算:JAVA/GO/Erlang(C对接GO语言很方便)
游戏引擎:C++/脚本
桌面开发:C++/Qt+Script/C#都是C开发的
数据库:C
编译器:C/C++
大数据:Java
云存储:JAVA/Python/Go
6.C语言32个关键字
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 unsigned union void volatile while
7.9种控制语句
if()~else~
for()~
while()~
do~while()
continue
break
switch
goto
return
8.34种运算符
算数运算:+ — * / % ++ --
关系运算:< <= > >= == !=
逻辑运算:! && ||
位运算符:<< >> ` | ^ &
赋值运算:=
条件运算:?:
逗号运算:,
指针运算:* &
求字节数:sizeof
强制类型转换:(类型)
分量运算:. ->
下标运算:[]
其他:()
9.注释
// 注释一行
/*~*/ 块注释
注释内容不参与编译
10.第一个C语言程序解释
//#include代表导入一个文件,std是一个标准库(stdio:标准输入输出库)
//.h表示头文件,<>表示导入系统文件,""表示导入系统文件
#include <stdio.h>
// int 是一种数据类型,如果出现在函数中,表示函数的返回值
//main 程序的主函数,程序有且只有一个主函数
//当一个函数中有参数的情况下,用","隔开,如果没有参数可以写上“void”,
//写不写都可以,因为void可以省略
int main(void)
//{}代表一个函数体、代码体、程序体
{
//第一个C语言程序代码
//printf()函数:在控制台上打印一串内容
//printf()函数,是stdio.h中系统提供的函数,表示再标准输出设备上打印字符串
printf("这是第一个C语言程序代码 !\n");
//\n表示一个转义字符,表示换行
//return如果出现再函数中,表示函数体结束,如果出现在主函数中,表示程序结束
//0表示函数返回值,要和函数返回值类型对应
return 0;
//在定义函数的时候,如果main定义的时候,前面是void,后面不需要写return
在main函数中,return0表示程序执行成功,return -1表示程序执行失败。
int main()和void main()在C语言中是一样的,但是C++只接受int main()这种定义方式。
}
关于include头文件:
(1)#include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
(2)使用C语言库函数需要提前包含库函数对应的头文件,如果这里使用了printf()函数,
需要包含,stdio.h头文件,可以通过 man 3 printf 查看printf所需要的头文件
(3)#include <> 与 #include "" 的区别?
①<>表示系统直接按系统制定的目录检索
②""表示系统现在""制定的路径(没写路径,代表当前路径)查找头文件,如果找不到,
再按系统指定目录检索。
11.使用命令行的方式编译C源代码文件
(1)首先查看有没有gcc编译环境
gcc -v
(2)然后使用命令
gcc -o 源代码文件.exe(不在使用.c了,改为.exe) 源代码文件(.c结尾的)
没有出现问题,会在当前目录生成一个.exe文件
如果出现错误“/数字”,那一定是标点符号错误。
12.system()函数
#include <stdlib.h>
int system(const char *command)
/*功能:在已运行的程序中执行另外一个外部程序
参数:外部可执行程序名称
返回值:
成功:0
失败:任意数字
*/
示例代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//再该函数中调用计算器功能程序
system(\'calc\');
return 0;
}
或者
#include <stdio.h>
#include <stdlib.h>
void main()
{
int value;
// 在该程序中调用计算器功能程序
value = system("calc");
printf("%d\n",value);
//调用成功返回0,失败返回任意数字
}
13.C语言编译过程
C语言(one:一步编译)
gcc -o xxx.exe xxx.c xxx.c xxx.c ...
gcc编译器介绍:
gcc(GNU Compiler Collection,GNU编译器套件),是由GNU开发的编程语言编译器。
gcc原本作为GNU操作系统的官方编译器,现在已被大多数类似于Unix操作系统(Linux、
BSD、Mac OS X等)采纳为标准的编译器,gcc同样适用于微软的Windows操作系统。
gcc发展历史;
gcc最初用来编译C语言,随着项目的发展,gcc已经成为了能够编译C、C++、Java、Ada、
fortran、Object C、Object C++、Go语言的编译器大家族。
编译命令格式:
gcc [-option] ... <filename>
g++ [-option] ... <filename>
·命令、选项和源文件之间用空格分隔
·一行命令中可以有0个、1个或多个选项
·文件名可以包含文件的绝对路径,也可以使用相对路径
·如果命令中不包含输出可执行文件的文件名,可执行文件的文件名会自动生成一个默认
名称,Linux平台为a.out,Windows平台为a.exe.
Windows下,一般电脑中是不配置有gcc的,所以可以安装C语言的集成开发环境,Qt或者其他,
然后,在该软件的bin目录下,一般有gcc可执行程序,将该程序的目录加载到系统环境
变量中去,就可以在CMD命令行界面使用。安装成功:在CMD中,查看gcc的版本号:
命令:gcc -v
14.C语言编译步骤
(1)预处理:宏定义展开(常量、变量)、头文件展开(把导入的头文件全部加载到主文件中
)、条件编译等,同时将代码中的注释删除,不检查语法
(2)编译:检查语法,将预处理后的文件编译生成汇编文件
(3)汇编:将汇编文件生成目标文件(二进制文件)
(4)链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接
到最终的可执行程序中去。
(链接的意思:就是例如printf函数只是一个.h文件,里面写的只是printf函数的格式
但是没有告诉函数实现的具体方式,实现方式都是以库文件的格式存在的,所以要将
printf函数的库文件也加载到可执行文件中,才可以运行)
C语言分布编译:
1.预处理:宏定义展开、头文件展开、条件编译,去掉注释
2.编译:检查语法,将C语言转成汇编语言
3.汇编:将汇编语言转成机器语言
4.链接:将C语言依赖库连接到程序中
gcc 分布编译:
预处理:gcc -E hello.c -o hello.i
编译:gcc -S hello.i -o hello.s
汇编:gcc -c hello.s -o hello.o
链接:gcc hello.o -o hello
常见代码错误:
1.编辑时异常
2.编译时异常
3.运行时异常
15.程序执行过程
硬盘(外存)——》内存(代码区、数据区、栈区、堆区)——》CPU(运算器、控制器、寄存器)
数据的计算过程:程序双击后,将程序的各个部分分成不同的区域加载到内存的各个区域中,
需要计算的时候(例如:计算攻击伤害的时候),会先将数据拿到CPU的寄存器中,
寄存器在通过控制器然后再走到运算器进行运算,运算完的结果,再从控制器拿到寄存器,
最后再放到内存中,内存中的数据就发生了变化,最后保存在本地。内存与CPU进行数据
交互是通过总线进行数据交互的。
16.查找程序所依赖的动态库
Windows平台下,需要相应的软件(Depends.exe)
因为C语言的可移植性较差,所以在一个可执行程序在Windows平台和Linux平台中所依赖的
动态库不同,同样的,window32位与windows64也存在兼容性问题,高版本兼容低版本,
低版本不兼容高版本,(64位兼容32位,向下兼容)
17.CPU内部结构与寄存器
(1)寄存器是CPU内部最基本的存储单元
(2)CPU对外是通过总线(地址、控制、数据)来和外部设备交互的,总线的宽度是8位,同时
同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU。
(3)如果总线是32位,寄存器也是32位,那么这个CPU就是32位CPU。
(4)有一种CPU内部的寄存器是32位的,但是总线是16位,叫做:准32位CPU。
(5)所有的64位CPU兼容32的指令,32位兼容16位的指令,所以在64位CPU上是可以识别
32位的指令的。
(6)在64位的CPU架构上于逆行了64位的软件操作系统,那么这个系统是64位。
(7)在64位的CPU架构上,运行了32位的软件操作系统,那么这个系统就是32位。
(8)64位的软件不能运行在32位的CPU上。(不兼容)
18.寄存器名称
8位:A B C D
16位:AX BX CX DX
32位:EAX EBX ECX EDX
64位:RAX RBX RCX RDX
19.寄存器、缓存、内存三者关系
按与CPU远近来分,离的近的是寄存器,然后缓存(CPU缓存),最后内存
CPU计算时:先预先把要用的数据从硬盘读取到内存,然后再把即将要用的数据
读取到寄存器。于是CPU《——》寄存器《——》内存三者之间及逆行信息交换。
有的电脑,在硬盘与内存之间也存在缓存,在内存与CPU之间也存在缓存,一般缓存存在于
内存与CPU之间。
20.为什么有缓存呢?
因为如果经常操作内存中的同一地址的数据,就会影响运算速度,于是就在寄存器与内存之间
设置一个缓存。因为缓存提取的速度高于内存,所以缓存的价格肯定远远高于内存。
由此可见:CPU<->寄存器<->缓存<->内存
21.VS中C语言嵌套汇编语言代码(了解)
#include <stdio.h>
int main()
{
//定义整形变量a,b,c
int a;
int b;
int c;
//asm表示汇编
__asm
{
mov a,3 //将3的值放在a对应的内存的位置
mov b,4 //将4的值放在b对应的内存的位置
mov eax,a //把A内存的值放在eax寄存器
add eax,b //把寄存器和b相加,结果放在eax
mov e,eax //把eax的值放在c中
}
printf("%d\n",c); //输出C的值
return 0; //结束程序
}
汇编语言:
mov 移动
add 添加
push 压栈
pop 出栈
call 调用
22.集成开发环境
IDE(继承开发环境)用于提哦概念股程序开发环境的应用程序,一般包括:编辑器、编译器
调试器和图形化界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发
软件服务。具备这一特性的软件或软件套(组)都可以叫集成开发环境。
(1)Qt Creator
Qt Creator是跨平台的Qt IDE,Qt Creator是Qt 倍 NoKia收购后推出的一款新的轻量级集成
开发环境(IDE),此IDE能够跨平台运行,支持系统包括:Linux(32/64 bit)、Mac OS X、Windows.
官方设计目标:是开发人员利用Qt应用程序框架更加快速简单的完成开发任务。
(2)VS(Microsoft Visual Studio)
VS是美国微软公司开发的工具包系列产品。VS是一个完整的开发工具集,它包括了整个软件
生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境(IDE)等等。
所编写的目标代码适用于微软支持的所有平台,VS是木崎爱你最流行的Windows平台应用程序的
集成开发环境。