c语言基础(一)

379 阅读6分钟

直接例子开始

两种编写 helloworld 的方式:

  1. 借助VS编辑工具编写。 创建项目 --> 创建 helloworld.c 源文件 --> 写 helloworld程序 --> Ctrl + F5 执行。
  2. 借助记事本、gcc编译工具编写。
  • gcc编译工具的环境变量配置:
  • 在QT的安装目录中找 gcc.exe 目录位置。例如:C:\Qt\Qt5.5.0\Tools\mingw492_32\bin
    • 我的电脑 -->属性 --> 高级系统设置 --> 环境变量 -->系统环境变量 --> path --> 将gcc.exe目录位置写入到 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文件执行的时候提示窗一闪而过的问题

  1. 通过system()函数解决: 在 return 0;之前 添加system("pause");函数调用。
  2. 使用_getch()等待下次输入。
  3. 借助VS工具解决: 在项目上 --->右键 ---> 属性 ---> 配置属性 ---> 连接器 ---> 系统 ---> 子系统 ---> 在下拉框中选择控制台 (/SUBSYSTEM:CONSOLE)

关于注释

  • 单行注释://
  • 多行注释:/* 注释内容 */
    • 不允许嵌套使用。 多行中可嵌套单行。

system 函数

  • 执行系统命令。如: pause、cmd、calc、mspaint、notepad.....
  • system("cmd"); system("calc");
  • 清屏命令:cls; system("cls");

gcc编译4步骤:【重点】预处理->编译->汇编->链接

image.png

  1. 预处理 -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
文件后缀含义
------------------------
.cC 语言文件
.i预处理后的 C 语言文件
.s编译后的汇编文件
.o编译后的目标文件

调试程序:

添加行号:
    工具--> 选项 --> 文本编辑器--> C/C++ --> 行号 选中。
  1. 设置断点。F5启动调试
  2. 停止的位置,是尚未执行的指令。
  3. 逐语句执行一下条 (F11):进入函数内部,逐条执行跟踪。
  4. 逐过程执行一下条 (F10):不进入函数内部,逐条执行程序。
  5. 添加监视: 调试 --> 窗口 --> 监视:输入监视变量名。自动监视变量值的变化。

C语言的特点

  • 优点
    • 代码量小
    • 执行速度快
    • 功能强大
    • 编程自由
  • 缺点
    • 写代码实现周期长
    • 可移植性较差
    • 过于自由,经验不足易出错
    • 对平台库依赖较多

c语言应用

image.png

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 ""的区别:

  1. < > 表示系统直接按系统指定的目录检索
  2. "" 表示系统先在 "" 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索

64位和32位系统

  1. 所有的64位CPU兼容32位的指令,32位要兼容16位的指令,所以在64位的CPU上是可以识别32位的指令
  2. 在64位的CPU构架上运行了64位的软件操作系统,那么这个系统是64位
  3. 在64位的CPU构架上,运行了32位的软件操作系统,那么这个系统就是32位 !!64位的软件不能运行在32位的CPU之上

寄存器

8位16位32位64位
AAXEAXRAX
BBXEBXRBX
CCXECXRCX
DDXEDXRDX

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编译,不运行
F10next调试
F11step调试