关于一些c语言基础概念的了解与学习
1.C语言概述
语言是人和人交流,C语言是人和机器交流。只是,人可以不听另外一个人,但是,计算机是无条件服从。
2.C语言特点
1) 优点
- 代码量小
- 执行速度快
- 功能强大
- 编程自由
2) 缺点
- 写代码实现周期长
- 可移植性较差
- 过于自由,经验不足易出错
- 对平台库依赖较多
3.C语言应用领域
C语言的应用极其广泛,从网站后台,到底层操作系统,从多媒体应用到大型网络游戏,均可使用C语言来开发:
- C语言可以写网站后台程序
- C语言可以专门针对某个主题写出功能强大的程序库
- C语言可以写出大型游戏的引擎
- C语言可以写出另一个语言来
- C语言可以写操作系统和驱动程序,并且只能用C语言编写任何设备只要配置了微处理器,就都支持C语言从微波炉到手机,都是由C语言技术来推动的
4.C语言的简洁
C语言仅有32个关键字,9种控制语句,34种运算符,却能完成无数的功能:
5.编写第一个C语言程序:HelloWorld
#include<stdio.h>
int main(){
printf("Hello world\n");
return 0;
}
C语言的源代码文件是一个普通的文本文件,但扩展名必须是.c。
6.代码分析
1) include头文件包含
- #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
- 使用C语言库函数需要提前包含库函数对应的头文件,如这里使用了printf()函数,需要包含stdio.h头文件
- 可以通过man 3 printf查看printf所需的头文件
- 导入一个文件 stdio.h ;std是一个标准库; i 代表input ;o 代表output;标准输入输出库 .h 头文件
#include< > 与 #include ""的区别:
- < > 表示系统直接按系统指定的目录检索
- "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
- <>表示导入系统文件; "" 表示导入自定义文件
2) main函数
- 一个完整的C语言程序,是由一个且只能有一个main()函数(又称主函数,必须有)和若干个其他函数结合而成(可选)。
- main函数是C语言程序的入口,程序是从main函数开始执行。
3) {} 括号,程序体和代码块
- {}叫代码块,一个代码块内部可以有一条或者多条语句
- C语言每句可执行代码都是";"分号结尾
- 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
- 所有的可执行语句必须是在代码块里面
4) 注释
- //叫行注释,注释的内容编译器是忽略的,注释主要的作用是在代码中加一些说明和解释,这样有利于代码的阅读
- /**/叫块注释
- 块注释是C语言标准的注释方法
- 行注释是从C++语言借鉴过来的
5) printf函数
- printf是C语言库函数,功能是向标准输出设备输出一个字符串
- printf(“hello world\n”);//\n的意思是回车换行
6) return语句
- return代表函数执行完毕,返回return代表函数的终止
- 如果main定义的时候前面是int,那么return后面就需要写一个整数;如果main定义的时候前面是void,那么return后面什么也不需要写
- 在main函数中return 0代表程序执行成功,return -1代表程序执行失败
- int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
7.system函数
system函数的使用
功能:在已经运行的程序中执行另外一个外部程序
参数:外部可执行程序名字
返回值:成功:0. 失败:任意数字
示例代码:
#include<stdio.h>
#include<stdlib.h>
int main{
system("ls");//或者system("calc")
return 0;
}
8. C程序编译步骤
C代码编译成可执行程序经过4步:
- 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
- 编译:检查语法,将预处理后文件编译生成汇编文件
- 汇编:将汇编文件生成目标文件(二进制文件)
- 链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
9.宏的定义
#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏。
宏替换
#define 名字 替换文本
步骤:
①在调用宏时,首先对参数进行检查,看看是否包含了任何由#define定义的符号。如果是它们首先被替换。
②替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替代。
③最后,再次对文本结果进行扫描,看看是否包含了任何由#define定义的符号。如果是就重复上述处理过程。
这样,宏定义参数和#define定义可以包含其他#define定义的符号。但是,宏不可以出现递归。
宏中的运算符
在定义宏时,经常会出现的两个运算符 # 和 ##
- #:出现在宏定义中的#运算符,会将其后面参数转化为一个字符串,我们把这种用法的成为字符串化运算符。
- ##:常用于把多个参数连接在一起。
宏优点
- 代码复用性好
- 能提高性能
宏缺点
- 不可调试(在预处理阶段进行了替换)
- 无类型安全检查
- 代码可读性差,容易出错
10.头文件的展开
①#include指令使另外一个文件被编译:预处理器先删除这条指令,并用包含文件的内容替换。这样一个文件被包含10次,那就实际被编译10次。
②库文件一般用 < > 包含;本地文件一般用 “ ” 包含。
③文件开头写:#pragma once 可以避免头文件的重复引入。
11.简单的一些预处理命令:
预处理命令 | 含义 |
---|---|
#define | 宏替换 |
#undef | 撤销定义过的宏名 |
#include | 让编译程序将另一源文件嵌入到含有#include的程序中 |
#if #endif | 如果#if后的常量表达式为true,则编译#if与#endif之间的代码,否则跳过这些代码。#endif标志着一个#if块的结束 |
#else | #else建立另一个选择,在#if失败后编译 |
#elif | 可以形成一个if else if 的阶梯状语句,进行多种编译选择 |
#line | 改变当前行数和文件名,它们是在编译程序中预先定义的标识符 |
#error | 编译程序中,只要遇到#error,就会生成一个编译错误提示信息,并停止编译 |
#pragma | 为实现时定义的命令,它允许想编译程序传递各种命令 |
12.条件编译
#if 常量表达式
程序段 1
#else
程序段 2
#endif
#if 常量表达式
程序段 1
#elif 常量表达式
程序段 2
#else
程序段 3
#endif
13.CPU内部结构与寄存器
64位和32位系统区别(了解)
- 寄存器是CPU内部最基本的存储单元
- CPU对外是通过总线(地址、控制、数据)来和外部设备交互的,总线的宽度是8位,同时CPU的寄存器也是8位,那么这个CPU就叫8位CPU
- 如果总线是32位,寄存器也是32位的,那么这个CPU就是32位CPU
- 有一种CPU内部的寄存器是32位的,但总线是16位,准32为CPU
- 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以识别32位的指令
- 在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位
- 在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位
- 64位的软件不能运行在32位的CPU之上
寄存器名字(了解)
8位 |
16位 |
32位 |
64位 |
A |
AX |
EAX |
RAX |
B |
BX |
EBX |
RBX |
C |
CX |
ECX |
RCX |
D |
DX |
EDX |
RDX |
寄存器、缓存、内存三者关系
- 按与CPU远近来分,离得最近的是寄存器,然后缓存(CPU缓存),最后内存。
- CPU计算时,先预先把要用的数据从硬盘读到内存,然后再把即将要用的数据读到寄存器。于是 CPU<--->寄存器<--->内存,这就是它们之间的信息交换。
- 那为什么有缓存呢?因为如果经常操作内存中的同一址地的数据,就会影响速度。于是就在寄存器与内存之间设置一个缓存。
- 因为从缓存提取的速度远高于内存。当然缓存的价格肯定远远高于内存,不然的话,机器里就没有内存的存在。
- 由此可以看出,从远近来看:CPU<--->寄存器<---> 缓存 <---> 内存。
14.汇编语言:
- mov 移动
- add 添加
- push 压栈
- pop 出栈
- call 调用
eax 32位寄存器
简单加法计算:
__asm
{
mov a, 10
mov b, 20
mov eax, a
add eax, b
mov c, eax
}
VS中C语言嵌套汇编代码(了解)
#include <stdio.h>
int main()
{
//定义整型变量a, b, c
int a;
int b;
int c;
__asm
{
mov a, 3 //3的值放在a对应内存的位置
mov b, 4 //4的值放在b对应内存的位置
mov eax, a //把a内存的值放在eax寄存器
add eax, b //eax和b相加,结果放在eax
mov c, eax //eax的值放在c中
}
printf("%d\n", c);//把c的值输出
return 0;//成功完成
}
VS反汇编
#include <stdio.h>
int main(){
//定义整型变量a, b, c
int a;
int b;
int c;
a = 3;
b = 4;
c = a + b;
printf("%d\n", c);//把c的值输出
return 0;//成功完成
}
15.断点和单步调试:
- 断点: 在选中行单击或按F9
- 调试程序:在“调试”中选择“开始调试”或按F5
- 逐语句执行:F11
- 逐过程执行:F10
- 跳出过程:Shift+f11
- 停止调试:Shift+F5
操作步骤:
- 设置断点F9
- 进行调试
- 选择反汇编按钮
- 根据汇编代码分析程序
16.集成开发环境(IDE)
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。
例:Microsoft Visual Studio,Qt Creator
参考资料:
B站黑马程序员C语言基础教程(up:黑马程序员)
https://blog.csdn.net/weixin_44032272/article/details/102979109
https://blog.csdn.net/weixin_44826356/article/details/99763818