首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的c程序恰好需要四个步骤?

为什么我的C程序恰好需要四个步骤?

C程序通常需要经历四个主要步骤:预处理、编译、汇编和链接。这些步骤是为了将源代码转化为可执行的机器代码,以便计算机能够理解和执行。

  1. 预处理(Preprocessing):在编译之前,预处理器会对源代码进行处理。它会执行一系列的文本替换和宏展开,处理包含的头文件,并删除注释等。预处理的目的是为了准备源代码供编译器使用。
  2. 编译(Compilation):编译器将预处理后的源代码转化为汇编代码。它会进行词法分析、语法分析和语义分析,将高级语言的代码转化为汇编语言的表示形式。编译器还会进行优化,以提高程序的性能和效率。
  3. 汇编(Assembly):汇编器将汇编代码转化为机器代码。它会将汇编语言的指令翻译成计算机能够直接执行的二进制指令。每个汇编语言指令都对应着一条机器指令,汇编器的任务就是将这些指令正确地转化为机器码。
  4. 链接(Linking):链接器将编译后的目标文件和库文件进行链接,生成最终的可执行文件。它会解析程序中的符号引用,将它们与符号定义进行匹配,以解决函数和变量的引用关系。链接器还会进行地址重定位,将各个目标文件中的代码和数据组合在一起,生成可执行文件。

这四个步骤是C程序的基本构成,每个步骤都有其独特的功能和作用。通过这些步骤,C程序可以被正确地转化为可执行的机器代码,从而在计算机上运行。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

1.3 运行C程序步骤

01 上机输入和编译源代码 通过键盘向计算机输入程序,如发现有错误,要及时改正。最后将此源程序以文件形式存放在自己指定文件夹内,文件用.c作为后缀。...02 对源程序进行编译 先用C编译系统提供“预处理器”对程序预处理指令进行编译预处理。在用编译系统对源程序进行编译时,自动包括了预编译和正式编译两个阶段,一气呵成。...03 进行连接处理 经过编译所得到二进制目标文件还不能供计算机直接使用,必须把所有的编译后得到目标模块连接装配起来,再与库函数形成一个整体,生成可执行程序。...04 运行可执行程序 一个程序从编写到运行成功,并不是一次成功,往往要经过多次反复。而且即使是编写好程序也并不一定能保证正确无误。

7243229

编写C程序7个步骤

很多人觉得编写一个C语言程序是个很复杂问题,但其实是很简单,至少对于二级C考试题目来说都比较简单。...写C程序有以下7个步骤: 定义程序目标 定义目标就是确定这个程序是干什么,实现什么功能。简单说,就是输入了什么,又输出什么? 设计程序结构 程序结构是尤为重要,它体现了你编程思路。...实现第一步目标,整体思路是怎样,每一小步都有哪些小问题,如何解决。 编写代码 根据第二步程序结构,一步步用代码实现。即把你思路逻辑翻译成C语言。...这是C语言基本功,要多加练习,从参考模仿到理解吃透。 编译程序 代码基本完成后,编译程序。当然一开始难免会报很多错误,不要害怕,根据提示认真检查修改,一般都是常见问题,熟练之后就能很快解决。...我们建议是,一定不要背题目背代码。因为遇到过很多同学,源代码放在那让他照着敲,都会出现各种问题,还不知道错在哪里,总是问老师:跟源代码一样啊,怎么不对?

1.9K50
  • 1.3 运行C语言程序步骤

    01上机输入和编译源代码  通过键盘向计算机输入程序,如发现有错误,要及时改正。最后将此源程序以文件形式存放在自己指定文件夹内,文件用.c作为后缀。...02对源程序进行编译 先用C编译系统提供“预处理器”对程序预处理指令进行编译预处理。在用编译系统对源程序进行编译时,自动包括了预编译和正式编译两个阶段,一气呵成。...03 进行连接处理 经过编译所得到二进制目标文件还不能供计算机直接使用,必须把所有的编译后得到目标模块连接装配起来,再与库函数形成一个整体,生成可执行程序。...04运行可执行程序  一个程序从编写到运行成功,并不是一次成功,往往要经过多次反复。而且即使是编写好程序也并不一定能保证正确无误。 更多案例可以go公众号:C语言入门到精通

    2.1K2927

    汇编程序调用c函数为什么需要设置栈?

    接下来,试图解释这个问题。 首先了解栈作用。关于这个,详细讲解要很长篇幅,故此处只做简略介绍。...其中保存寄存器中,也包括lr值(因为用bl指令进行跳转的话,之前pc值存在lr中),在子程序执行完毕后,再把栈中lr值pop出来,赋值给pc,这样就实现了子函数正确返回。...该文件是包含了u-boot可执行汇编代码,从中我们可以看到相应C程序对应汇编代码。...时,用bl指令,所以会自动把跳转时pc值赋值给lr,所以也不需要push将PC值保存到栈。...当然也可以用其他暂时空闲没有用到寄存器来传递返回值。 对于使用哪个寄存器来传递返回值,是根据ARMAPCS寄存器使用约定而设计,最好按照其约定来处理,不要随便改变它。这样程序将更加规范。

    1.2K10

    Spring容器里为什么没有需要Bean?

    Spring容器里为什么没有需要Bean?...小故事 有一天,项目经理收到一个紧急需求,需要新增一个模块,项目经理看了看开发区同学,一眼就看到盯着屏幕笑嘻嘻小菜同学 项目经理心想:这傻小子在乐什么呢,肯定是在摸鱼,就让新需求给他做吧 项目经理悄咪咪偷摸到小菜身后...,看着小菜在沸点评论区不停滑动,似乎在寻找着什么大瓜 此时小菜似乎察觉到气氛不太对劲,身后似乎有人,于是飞快按下 Windows + 1 弹出Idea开发界面 此时,项目经理开口道:小菜啊,这里有个紧急需求...controller包与其同级时无法扫描其中组件,因此导致容器中找不到对应Bean 如果需要扫描其他包,或者需要依赖公共项目common下包时,可以使用配置basePackages,如果已经配置*...,如果需要扫描其他包,需要配置**@ComponentScan****basePackages**或**value**字段** 当配置过**@ComponentScan**时,默认不会扫描当前包下组件

    10221

    c语言gdi绘图_程序设计基本步骤

    大家好,又见面了,是你们朋友全栈君。 本文将实现对基本图形绘制: windows程序画图,大体上有3种方法: (1)你告诉系统点坐标和颜色,系统通过SetPixel来画。...有几点需要特别注意: (1)实际上画椭圆也是先画矩形,然后计算内接椭圆得出。...(3)程序运行结果,使得对角线被椭圆遮挡住了。如果改变顺序,最后画对角线,就没有遮挡发生。这说明,画出图,是“实心”,不能简单理解为只有轮廓。...,必须是已经注册 TEXT("画图"), //窗口标题 WS_OVERLAPPEDWINDOW, //窗口风格 CW_USEDEFAULT, //X坐标 CW_USEDEFAULT...PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } 发布者:全栈程序员栈长

    54410

    c++程序设计作业-atm

    程序说明: 本作业atm部分用了大概两天时间来完成。 一开始工作是尝试着在原框架代码上加注释,以此来了解老师给出基本思路。...同时着手对框架中不符合c++标准,没有能很好地利用c++特性地方进行修改 本项目使用面向对象编程方法,抽象出atm类和account账户类,做到基本实现作业要求 亮点之处: 1.充分利用c++...string类代替c语言风格字符数组,简化了许多操作 2.统一管理用户界面,实现表现逻辑与业务逻辑分离和代码重用 3.结合控制台清屏、延时、密码星号回显输入等技术,优化用户界面 4.使用简单文本文件作为本地持久化存储解决方案...5.规范编码,包括变量和方法命名、注释等 6.全局调试信息输出开关,方便测试程序 exe目录内含文件分别为打开/关闭全局调试信息输出开关、调试/发布方式编译得出文件 目录中另外三个文本文件为运行时需要用到数据文件...* (1)用类实现ATM主要功能 * (2)提示用户执行操作,内置用户资料,输入操作动作和信息。 * (3)程序可执行对不同用户储存,取款,查账,转账,修改密码等一系列动作。

    98420

    为什么程序有bug(一):逻辑篇

    本来是希望 when <10 之后应该continue,在写第一个when<0时候头脑还是很清晰。但是呢,当写第二个时候就用四肢写代码了,习惯性打了个return。...dbAccountEntity.getAge());//错误姿势一 accountEntity.setTel(accountEntity.getTel());//错误姿势一 } 我们在进行数据库存储数据时,通常需要进行数据实体转换...这里举例比较简单,尤其是当我们有复杂条件判断时,需要注意判断条件是否符合预期。...accountService == null){ waitBind();//等待绑定成功、然后跨进程获取数据 } Info info = pushService.aidlGetInfo(); } 发现这个问题现象是程序刚启动时随机出现几次...但是,我们在清除accountID时只清除了数据库,没有清除缓存,再次登录时候用缓存值。这样就会导致程序陷入了死循环。所以在进行存储操作时,需要考虑好同步问题。

    94720

    你学不懂C语言,是因为不懂编写C程序7个步骤

    一般情况下,我们把编写C程序分为7个步骤,懂得了后,编写程序就会有整体思路,再也不像从前那样毫无头绪了。 1.定义程序目标 定目标。明确这个程序是实现什么样功能,你自己想要做出什么。...明白你程序需要哪些信息,像数学公式、数学单位转换信息。比如判断一个数是不是素数,“素数”在数学上是怎么界定呢?这些都是你应该想清楚、弄明白。不要一上来,就想着怎么用计算机语言表示。...- 用户看到整个程序界面应该是怎样?目标用户是怎样一类人?你需要花费多长时间来解决掉这个程序? - 在程序中如何表示数据,用数组还是结构体呢?用什么方法处理数据?...这一步也不需要想到具体代码怎么写。 小编给大家推荐一个学习氛围超好地方,C/C++交流企鹅裙:【8.7.0+九.六.三+2.5.1】适合在校大学生,小白,想转行,想通过这个找工作加入。...可以运行程序,只能说是语法上没有错误,而语义上是否存在错误,就需要多次测试。bug与debug过程。

    87240

    程序员编写技术文章需要四个辅助神器 ,强烈建议收藏 !

    编写技术文章是程序员分享经验和记录学习成果重要方式。 这篇文章,笔者将介绍四款简单实用工具,这四款工具可以帮助程序员更轻松地编写技术文章。...Markdown 是用来编写结构化文档一种纯文本格式,它使我们在双手不离开键盘情况下,可以对文本进行一定程度格式排版。...,当离开正在编辑有格式文本段后,Typora 会自动隐藏 Markdown 标记,展现「所见即所得」效果。...为了防止一些程序 bug 发生导致格式问题无法修改,Typora 保留了一个「源代码模式」。 我们可以通过 视图 - 源代码模式 或左下角 按钮进入。...spm_id_from=333.999.0.0&vd_source=a167ce1b655931b132bb9bbb22609d12 如果文章对你有所帮助,还请帮忙点赞、在看、转发一下,你支持会激励输出更高质量文章

    13310

    为什么数据库应用程序这么慢?

    专注于一个小型可重复工作流将让您隔离问题。 接下来问题当然是为什么要花10秒钟?缩小问题第一个也是最简单方法是将应用程序尽可能靠近SQL Server,在同一台机器上或在同一个LAN上运行。...如果应用程序仍然需要10秒钟时间来加载结果,那么恭喜,您再次消除了4个问题中2个!现在,您需要查看处理时间大部分在哪里。 我们来仔细看一下如何解决这段时间大部分消费地方。...要获取大致SQL处理时间: 重新打开您在Wireshark中步骤2中创建文件,将流量过滤到只有响应: tds.type == 0x04 && tds.packet_number == 1 上述过滤器将仅显示每个响应中第一个...或者,当您知道您没有带宽瓶颈时,您需要查看应用程序使用多少带宽。为此,您还需要运行靠近数据库应用程序,捕获Wireshark中数据包,并检查应用程序使用带宽。...但是,在完成上述步骤之后,您应该能够将所有时间用于处理工作流程。如果10秒处理时间显示为6秒SQL处理时间,3秒传输时间和1秒应用处理时间,那么您将了解如何确定您调查优先级。

    2.3K30

    为什么建议大家一定C 语言

    其设计精髓,其内涵思想,都是值得当下我们学习与借鉴 2、C 语言作为接触编程开始,对影响很大,带入了 IT 这行,本人也是极其喜欢 C 语言,C 语言涉及了很多底层知识,比如:内存...,由一名后台转算法,仅仅用了 3 个月时间,但是为什么能这么快成功转型呢 扎实基础功底、快速学习能力、解决问题能力、以及个人潜力 扎实基础功底很重要,基础是什么:数据结构 + 算法,操作系统...,这些都是相通,公司需要做什么,快速学习就好 语言是工具,重要是思想,很认同这句话,以前没接触过 go,在百度实习时候,导师还给了我 1 周时间去熟悉,才上项目,以前没咋用 Python...,以及 C 语言指针伟大魅力,被深深折服其中,在 C 世界中,充满了好奇心,总想去探索、去发现未知世界 C 语言能够让你更加深刻认识内存和编译原理,了解程序每一个细节,夯实基本功,站得“低...”才能望远,所以优秀程序员都会学习 C 语言,你想成为优秀程序员吗?

    1.4K50

    从这个角度,终于理解为什么需要Kafka这样东西了!

    我们都知道,数据库中数据,只要应用程序员不主动删除,就可以任意次读写,多少次都行。数据库还对外提供了很漂亮接口——SQL ——让程序员操作数据。...更直接办法是让应用程序之间直接交互,例如程序A调用程序BRESTful API。 但问题是程序B如果暂时不可用,程序A就会比较悲催,怎么办呢?等一会儿再试? 如果程序B还不行,那就循环再试。...可是传统MQ也有问题,通常情况下,一个消息确认被读取以后,就会被删除。如果来了一个新程序C,也想读之前消息,或者说之前一段时间消息,传统MQ表示无能无力。...只要记录下每个程序都读到了哪个编号, 这个程序可以断开和Kafka连接,这个程序可以崩溃,下一次就可以接着读。 新消费者程序可以随意加入读取,不影响其他消费者程序, 是不是很爽?...例如:程序B读到了编号为3消息, 程序C读到了编号为5消息, 这时候来了一个新程序D,可以从头开始读。

    1.6K40

    为什么建议需要定期重建数据量大但是性能关键

    如果大家发现网上有抄袭本文章,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~ 本文是“为什么建议”系列第三篇,本系列中会针对一些在高并发场景下,对于组内后台开发一些开发建议以及开发规范要求进行说明和分析解读...往期回顾: 为什么建议在复杂但是性能关键表上所有查询都加上 force index 为什么建议线上高并发量日志输出时候不能带有代码位置 一般现在对于业务要查询数据量以及要保持并发量高于一定配置单实例...BY id DESC LIMIT 20 这个表分片键就是 user_id 一方面,正如我在“为什么建议在复杂但是性能关键表上所有查询都加上 force index”中说,数据量可能有些超出我们预期...久而久之,你数据可能会变成这样: 这样导致,原来你需要扫描很少页数据,随着时间推移,碎片越来越多,要扫描页越来越多,这样 SQL 执行会越来越慢。...MySQL 5.6.17 之后,Optimize table 命令变成了 Online DDL,仅仅在准备阶段以及最后提交阶段,需要获取锁,中间执行阶段,是不需要,也就是不会阻塞业务更新 DML

    85130

    不是有效win32应用程序 为什么需要有效

    随着互联网技术发展,在成年人日常生活中需要电脑来工作,即使是学生,在上学期间也会需要电脑。...例如学校用电脑授课,这都是需要电脑来完成,而对于电脑使用,有一部分人是有要求,例如win32程序系统。那么哪种不是有效win32应用程序?...二、为什么需要有效 无效win32应用程序,会使电脑不能运行。win32应用程序可以为用户提供优质体验。...在之前应用程序大部分都是单进程单线,很不方便,即使是最优秀程序员,在运用单进程单线应用程序时,也只能以驻留留存方式实现多任务运行。...怎么更好地使用win32应用程序,希望可以帮助需要的人,简单了解了win32应用程序

    1.2K20

    第一个caffe C++程序

    最后还是决定从最基本模型入手,编写并运行一个caffe程序,并能够真正跑起来。 其实网上和书本上都有很多caffe C++例子,但是真正自己编译运行是总会碰到这样或那样问题。...CUDA 8.0版本 这篇文章主要还是说明caffe C++程序编写,关于环境方面的问题可以搜索网上资料。...Hello World 在很多编程教程中都会选择输出一个hello world作为第一个示例,作为第一个caffe程序也希望训练一个足够简单AI模型,解决一个足够简单问题。...嗯,就如同helloworld程序一样,这个程序并没有什么实际用途,但它足够简单,足以让我们对AI程序有个初步印象。 使用模型如下: ?...至此,第一个caffe程序编写完毕,虽然大部分内容来自网络,但总归是亲手敲进去,并编译运行出来,接下来我会研究如何将这个helloworld搬到Android手机上运行。

    98730

    C语言为什么需要include就能使用里面声明函数?

    有人问:C语言为什么需要include就能使用里面声明函数?这是一个看起来非常简单问题,但是很多初学者,甚至学了很久的人都可能没有搞明白。 为什么包含即可用?...要明白包含即可用原因,就必须讲到C语言代码是如何变成可执行文件了,这里可以参考《hello程序是如何变成可执行文件》。...所以实际上,你只是在你.c中声明了这些函数,既然声明了,那么你就可以使用。但是你要想真正用到它,还需要找到它定义。这是在链接阶段做事情。...链接时候,链接器会知道,诶,你这个程序需要printf函数啊?好去libc.so里面找找,看看有没有哈。,巧了,还真有,恭喜你可以用。...(-lm表示需要链接math库) 当然了,对于C++,使用pow函数不用链接math库也是可以为什么呢?请移步这里《C++为什么需要单独链接math库?》。 不包含可以用吗?

    1.3K20
    领券