程序的运行过程

目录

>黑科技

typedef

static

goto语句

>程序的执行过程

编辑

编译

链接

执行


在介绍内容之前,先对前面的内容更新几个黑科技。

  • >黑科技

  • typedef

 typedef可以更改类型的名称,如果你觉得类型名不好听,就用这个关键字自己重新定义,当然这个定义只是在这个程序中,其他程序是不影响的。

具体运用:类型名+新名
如:typedef int myint;这个时候int类型就是myint了。任何类型都可以自己改名字的

  • static

 static修饰一个变量时,会将当前变量的生命周期变为全局生命周期,但不影响变量的作用域。

//c语言
//举个例子

void test1()
{    //所谓生命周期,简单的说,就是在某个{}内。变量在哪个{}内被定义,出了该{}它就销毁掉了
    int tmp = 0;//这个tmp局部变量,当这个函数被调用完了这个变量就销毁掉了
    static int tmp2 = 1;//这个时候这个tmp2就可以当成全局变量的。任意{}都可以使用
}

 static修饰全局变量时,会导致该全局变量的作用域仅限当前。

//c语言
//这个意思是说

int tmp = 0;
int tmp2 = 1;//这儿有2个全局变量
void test2()
{
    tmp = 3;//这个时候全局变量被改成了3
    static tmp2 = 6//这个时候的全局变量出了这个函数,会恢复成原来的值,也就是 1.
}
  • goto语句

goto 标签语句,也可以说是跳转语句。它的作用是跳转到标签的位置,可以说是一个循环。也可以说是打破了循环。

需要+标签

//c语言

//goto语句使用

void test4()
{
    sig://标签
    int i = 0;
    printf("我回来了!\n");
    while(1)
    {
        Sleep(1000);//休眠函数,休眠一秒
        if(i == 3)
        {
            printf("3秒后~")
            goto sig;//跳转到标签位置,所以说它打破了循环,但自己也是一个循环
        }
        ++i;
    }
}
  • >程序的执行过程

一个程序的执行,会经过下面几个过程

  1. 编辑:首先我们得编辑好代码。代码保存的文件的后缀是.c,这是c语言写的。产生一个.c文件
  2. 编译:将代码放到c语言编译环境中,译成机器认识的语言。先产生一个.i文件,后成为.s文件,接着生成.obj文件
  3. 链接:链接是链接和连接两个过程的。链接我们要用的库,连接多个.c文件。生成可执行文件
  4. 执行:没有出现错误的话,就可以执行了。

下面来详细说一下上面的过程

  • 编辑

我们写c语言的程序的时候,不一定非要在vs,dev等开发环境下写。我们也可以在电脑上的记事本,写字板,word等地方写,写完之后,后缀改成  .c  就行。这个时候就完成了一个c语言的程序的编辑。

  • 编译

编译首先是对写的代码进行一个错误检查,检查逻辑和语法是狗错误。由于c语言是高级语言,计算机不认识,所以需要通过一个编译器进行编译。编译又分为下面 的过程

  • 预处理

预处理是在还没有编译之前进行的,如果程序中有预处理命令,需要先进行预处理。预处理阶段生成.i文件

常用的预处理命令有:

  1. 文件包含命令
  2. 条件编译命令
  3. 宏定义命令
  • 文件包含命令

文件包含命令,就是我们包含头文件的include的那个命令,比如:#include<stdio.h>、#include"myfile.h"

""和<>的区别可以简单的理解成:" "是自己写的头文件,<>是系统的库头文件。当然" "也可以是库里面的头文件,因为""的寻找过程是:编译时先寻找你正在编辑的源代码文件所在的文件夹里面有没有""中的头文件。如果有,优先加载这个文件,如果没有,就会在软件设置指定的路径中寻找里面是否有""中的库文件。如果有,直接加载;如果没有,报错。而<>是直接去默认路径下去找,没有则报错,有则加载。

  • 条件编译命令

格式一

#ifdef<标识符>

<代码段1>

#else

<代码段2>

#endif

如果标识符定义了,则执行<代码段1>,没有定义则执行<代码段2>

#ifdef<标识符>

<代码段1>

#endif

如果标识符定义了,则执行<代码段1>,否则不执行,当成注释

格式二

#ifndef<标识符>

<代码段1>

#else

<代码段2>

#endif

如果标识符没有定义,则执行<代码段1>,定义则执行<代码段2>

#ifndef<标识符>

<代码段1>

#endif

如果标识符没有定义,则执行<代码段1>,否则不执行,当成注释

  • 宏定义命令

#define 标识符 字符串

  • 编译

编译的过程主要是进行词法分析和语法分析,这个阶段生成.s的汇编代码文件

1)进行词法分析:对字符组成的单词进行词法分析,检查单词是否使用正确,删除程序中冗余的成分

2)进行语法分析:检查每条语句是否是正确的逻辑结构

3)生成符号表:映射程序中的各种符号以及它们的属性

4)进行错误处理:将程序中的错误分为警告和致命通知给用户

5)生成目标代码

  • 汇编

这个时候就是把汇编代码文件转换成二进制的目标文件,这个阶段生成.obj的目标文件(Linux下是.o文件)

  • 链接

链接其实也是编译中的最后一个环节。这个阶段把目标文件生成可执行文件。如果有多个源文件,会生成多个目标文件。则需要将多个目标文件连接成一个目标文件最后程序中肯定需要某些库中的接口,函数,代码等,这个时候就需要链接。所以链接这儿一共是两个过程,先连接,后链接。

  • 执行

最后生成了可执行文件,就可执行了。当然执行后可能会发生编译时没有发现的错误,或者得到的结果没有达到预期。这个时候就是出现了传说中的bug。这个时候就需要借助开发环境中的调试工具。学习调试,请点击调试技巧

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值