直接例子开始
两种编写 helloworld 的方式:
- 借助VS编辑工具 编写。 创建项目 --> 创建 helloworld.c 源文件 --> 写 helloworld程序 -->
Ctrl + F5
执行。 - 借助记事本、gcc编译工具编写。
- gcc编译工具的环境变量配置:
- 在QT的安装目录中找
gcc.exe
目录位置。例如:C:\Qt\Qt5.5.0\Tools\mingw492_32\bin
- 我的电脑 -->属性 --> 高级系统设置 --> 环境变量 -->系统环境变量 --> path --> 将
gcc.exe
目录位置写入到 path的值中。
- 我的电脑 -->属性 --> 高级系统设置 --> 环境变量 -->系统环境变量 --> path --> 将
- 使用记事本创建
helloworld.c 文件
--> 在记事本中写helloworld 程序
--> 使用cc编译工具 ,在记事本写的helloworld.c
所在目录中,执行gcc helloworld.c -o myhello.exe
--> 在终端(黑窗口)中,运行 :myhello.exe
编写helloworld程序
c
// #include的意思是头文件包含,#include <stdio.h>代表包含stdio.h这个头文件
#include<stdio.h> // 所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
#include<conio.h>
#include<stlib.h>
int main(void) // int main()和void main()在C语言中是一样的,但C++只接受int main这种定义方式
{
printf("hello world"); // 可以通过man 3 printf查看printf所需的头文件
// system("pause"); // system函数的作用:在已经运行的程序中执行另外一个外部程序
// _getch();
return 0; // C语言每句可执行代码都是" **;** "分号结尾
}
解决exe文件执行的时候提示窗一闪而过的问题
- 通过
system()
函数解决: 在 return 0;之前 添加system("pause");
函数调用。 - 使用
_getch()
等待下次输入。 - 借助VS工具解决: 在项目上 --->右键 ---> 属性 ---> 配置属性 ---> 连接器 ---> 系统 ---> 子系统 ---> 在下拉框中选择
控制台 (/SUBSYSTEM:CONSOLE)
关于注释
- 单行注释://
- 多行注释:/* 注释内容 */
- 不允许嵌套使用。 多行中可嵌套单行。
system 函数
- 执行系统命令。如:
pause、cmd、calc、mspaint、notepad.....
system("cmd"); system("calc");
- 清屏命令:
cls; system("cls");
gcc编译4步骤:【重点】预处理->编译->汇编->链接
- 预处理 -E xxx.i 预处理文件
gcc -E xxx.c -o xxx.i
注意这里是.c而不是.cpp
lua
1. 头文件展开。 --- 不检查语法错误。 可以展开任意文件。
2. 宏定义替换。 --- 将宏名替换为宏值。
3. 替换注释。 --- 变成空行
4. 展开条件编译 --- 根据条件来展开指令。
- 编译 -S xxx.s 汇编文件
gcc -S hello.i -o hello.s
markdown
1. 逐行检查语法错误。【重点】 --- 整个编译4步骤中最耗时的过程。
2. 将C程序翻译成 汇编指令,得到.s 汇编文件。
- 汇编 -c xxx.o 目标文件
gcc -c hello.s -o hello.o
markdown
1. 翻译:将汇编指令翻译成对应的 二进制编码。
- 链接 无 xxx.exe 可执行文件。
gcc hello.o -o hello.exe
markdown
1. 数据段合并
2. 数据地址回填
3. 库引入
过程 | 命令 |
---|---|
预处理 | 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 |
选项 | 含义 |
---------- | ---------------- |
-E | 只进行预处理 |
-S(大写) | 只进行预处理和编译 |
-c(小写) | 只进行预处理、编译和汇编 |
-o file | 指定生成的输出文件名为 file |
文件后缀 | 含义 |
------------ | ------------ |
.c | C 语言文件 |
.i | 预处理后的 C 语言文件 |
.s | 编译后的汇编文件 |
.o | 编译后的目标文件 |
调试程序:
rust
添加行号:
工具--> 选项 --> 文本编辑器--> C/C++ --> 行号 选中。
- 设置断点。F5启动调试
- 停止的位置,是尚未执行的指令。
- 逐语句执行一下条 (F11):进入函数内部,逐条执行跟踪。
- 逐过程执行一下条 (F10):不进入函数内部,逐条执行程序。
- 添加监视: 调试 --> 窗口 --> 监视:输入监视变量名。自动监视变量值的变化。
C语言的特点
- 优点
- 代码量小
- 执行速度快
- 功能强大
- 编程自由
- 缺点
- 写代码实现周期长
- 可移植性较差
- 过于自由,经验不足易出错
- 对平台库依赖较多
c语言应用
c语言中的32个关键字
- 常见的
arduino
break case const continue default do else enum for if return static switch void while
- 不常见的
objectivec
auto char double extern float goto int long register
signed sizeof struct typedef unsigned union volatile
关于gcc
plaintext
gcc(GNU Compiler Collection,GNU 编译器套件),是由 GNU 开发的编程语言编译器。
gcc原本作为GNU操作系统的官方编译器,
现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,
gcc同样适用于微软的Windows。
编译命令格式:
gcc [-option1] ... <filename>
g++ [-option1] ... <filename>
可执行文件的文件名会自动生成一个默认名,Linux平台为[a.out],Windows平台为[a.exe]
include
#include< > 与 #include ""的区别:
- < > 表示系统直接按系统指定的目录检索
- "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
64位和32位系统
- 所有的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 |
c语言嵌套汇编语言
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;//成功完成
}
集成开发环境IDE
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面工具。
Microsoft Visual Studio常用快捷键
快捷键 | 含义 |
---|---|
Ctrl + k,Ctrl + f | 自动格式化代码 |
Ctrl + k,Ctrl + c | 注释代码 |
Ctrl + k,Ctrl + u | 取消注释代码 |
F9 | 设置断点 |
F5 | 调试运行 |
Ctrl + F5 | 不调试运行 |
Ctrl + Shift + b | 编译,不运行 |
F10 | next调试 |
F11 | step调试 |