直接例子开始
两种编写 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程序
// #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
1. 头文件展开。 --- 不检查语法错误。 可以展开任意文件。
2. 宏定义替换。 --- 将宏名替换为宏值。
3. 替换注释。 --- 变成空行
4. 展开条件编译 --- 根据条件来展开指令。
2. 编译 -S xxx.s 汇编文件
gcc -S hello.i -o hello.s
1. 逐行检查语法错误。【重点】 --- 整个编译4步骤中最耗时的过程。
2. 将C程序翻译成 汇编指令,得到.s 汇编文件。
3. 汇编 -c xxx.o 目标文件
gcc -c hello.s -o hello.o
1. 翻译:将汇编指令翻译成对应的 二进制编码。
4. 链接 无 xxx.exe 可执行文件。
gcc hello.o -o hello.exe
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 | 编译后的目标文件 |
调试程序:
添加行号:
工具--> 选项 --> 文本编辑器--> C/C++ --> 行号 选中。
- 设置断点。F5启动调试
- 停止的位置,是尚未执行的指令。
- 逐语句执行一下条 (F11):进入函数内部,逐条执行跟踪。
- 逐过程执行一下条 (F10):不进入函数内部,逐条执行程序。
- 添加监视: 调试 --> 窗口 --> 监视:输入监视变量名。自动监视变量值的变化。
C语言的特点
- 优点
- 代码量小
- 执行速度快
- 功能强大
- 编程自由
- 缺点
- 写代码实现周期长
- 可移植性较差
- 过于自由,经验不足易出错
- 对平台库依赖较多
c语言应用
c语言中的32个关键字
- 常见的
break case const continue default do else enum for if return static switch void while
- 不常见的
auto char double extern float goto int long register
signed sizeof struct typedef unsigned union volatile
关于gcc
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语言嵌套汇编语言
#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调试 |