C语言笔记-1 编译过程&字节数

这篇具有很好参考价值的文章主要介绍了C语言笔记-1 编译过程&字节数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C 基础语法

概述

C语言编译过程包括了预处理、编译、汇编和链接四个主要阶段。下面是对每个阶段的简要介绍:

  1. 预处理(Preprocessing):在这个阶段,预处理器根据预处理指令(以 # 开头的指令)对源代码进行处理。预处理器执行宏展开、条件编译、头文件包含等操作,生成经过预处理的代码。

  2. 编译(Compilation):编译器将经过预处理的代码进行词法分析、语法分析和语义分析,生成中间代码(通常是汇编代码)。

  3. 汇编(Assembly):汇编器将中间代码转换为机器语言指令,生成目标文件。目标文件包含机器指令的二进制表示形式以及相关的符号信息。

  4. 链接(Linking):链接器将目标文件与其他需要的目标文件(例如库文件)进行链接,解析符号引用和重定位,生成最终的可执行文件。

下面是一个简单的示例代码,展示了一个C语言程序的基本结构和编译过程的几个阶段:

#include <stdio.h>

#define PI 3.14159

int main() {
    int radius = 5;
    float area;

    area = PI * radius * radius;
    printf("The area of the circle is: %f\n", area);

    return 0;
}

在这个示例中,#include <stdio.h>是一个预处理指令,用于包含标准输入输出库的头文件。#define PI 3.14159定义了一个宏常量。

编译器会对源代码进行词法分析、语法分析和语义分析,生成汇编代码。汇编器将汇编代码转换为机器指令,生成目标文件。链接器将目标文件与标准库等进行链接,生成可执行文件。

请注意,具体的编译过程可能因编译器和操作系统而异。上述过程是一个典型的编译过程示例,但实际情况可能会有所不同。

注意
  • if(a=表达式) 判断的就是a的值,而不是判断这个赋值操作的成功与否。
    • 查看对应的汇编代码,它是直接用a的地址里的值来和0做比较,就是把左边的a地址里的值作为if中的判断条件。
  • scanf("%c", &p[i].job); //当读入一个字符时,要注意加&

C 其他知识点

编译过程

C语言笔记-1 编译过程&字节数

编译器数据模型区别

C语言笔记-1 编译过程&字节数

32/64位机器中,各数据类型所占位数

下图32位与64位类型所占字节数是在linux系统下的字节数,如果是windows下个别会有所变化,比如windows 64位下的long与unsigned long均为4字节

C语言笔记-1 编译过程&字节数

这即是说各个类型的变量长度是由编译器来决定的,而当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节(例如,GCC)。下面列举在GCC编译器下32位机器和64位机器各个类型变量所占字节数:

C语言笔记-1 编译过程&字节数

assert() 断言(宏)

assert 宏的原型定义在 assert.h 中,其作用是如果它的条件返回错误,则终止程序执行。

#include <assert.h> 
void assert( int expression );

其表达的意思就是,程序在我的假设条件下,能够正常良好的运作,其实就相当于一个 if 语句:

if(假设成立) {
     程序正常运行;
}
else {
      报错&&终止程序!(避免由程序运行引起更大的错误)  
}

assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。

使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

在调试结束后,可以通过在包含 #include 的语句之前插入 #define NDEBUG 来禁用 assert 调用,示例代码如下:

#include 
#define NDEBUG 
#include
用法总结与注意事项

1)在函数开始处检验传入参数的合法性

如:

int resetBufferSize(int nNewSize) 
{ 
//功能:改变缓冲区大小, 
//参数:nNewSize 缓冲区新长度 
//返回值:缓冲区当前长度 
//说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区 
assert(nNewSize >= 0); 
assert(nNewSize <= MAX_BUFFER_SIZE); 
 
... 
}

2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

不好:

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize); 

好:

assert(nOffset >= 0); 
assert(nOffset+nSize <= m_nInfomationSize); 

3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

错误: assert(i++ < 100)

这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

正确:

assert(i < 100)
i++; 

4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

5)有的地方,assert不能代替条件过滤

程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。断言assert 是仅在Debug 版本起作用的宏,它用于检查"不应该"发生的情况。以下是一个内存复制程序,在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。文章来源地址https://www.toymoban.com/news/detail-500977.html

到了这里,关于C语言笔记-1 编译过程&字节数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HarmonyOS鸿蒙学习基础篇 - 基本语法概述

    书接上文 HarmonyOS鸿蒙学习基础篇 - 运行第一个程序 Hello World 基本语法概述 打开 entrysrcmainetspagesindex.ets 代码如下 代码详细解释如下: 在以上示例中,ArkTS的基本组成如下所示。  装饰器: 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Comp

    2024年01月24日
    浏览(47)
  • oracle存储过程(基础语法)

            存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过

    2023年04月08日
    浏览(35)
  • Go语言的编译过程

            Go 语言和Java语言一样都是一门需要编译才能运行的编程语言,也就是说代码在运行之前需要通过编译器生成二进制机器码。         Go 语言编译器的源代码在 src/cmd/compile 目录中,目录下的文件共同组成了 Go 语言的编译器,而编译过程是一个多阶段的过程,它

    2024年02月03日
    浏览(29)
  • 【编译原理】-- 递归下降语法分析设计原理与实现(C语言实现)

    本实验基于词法分析程序实现,可参考本人前面的文章。 目录 一、目标任务 二、程序功能描述 三、主要数据结构描述 四、程序结构描述 设计方法 First集和Follow集 递归子程序框图 函数定义及函数之间的调用关系 五、程序测试 测试用例1 测试结果1 测试用例2 测试结果2 测试

    2023年04月21日
    浏览(37)
  • c语言中编译过程与预处理

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在c语言的一个项目中会有很多.c文件,这些.c文件就是源文件,组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code),即每个源文件都转换为对应的目标文件,即.obj文件。 然后这些

    2024年02月11日
    浏览(29)
  • 写代码,编译代码,执行代码以及相关的java的基础语法

    在黑窗口 输入javac 文件名字 在黑窗口 输入java 文件.class名字 我们可以把常说的bug说成甲虫,因为bug就是从甲虫来的 黑窗口一般报了这个错误代表的是英文符号的写成中文的 说明你的程序包对象写的并不对,一般大小写出现错误导致,比如System写成system 用Notepad软件可以发现

    2024年02月11日
    浏览(26)
  • C编译过程 以及 ELF文件(学习笔记)

    一个用C语言编写的高级语言程序是从编写到打包、再到编译执行的基本过程,我们知道在CPU上执行的是低级别的机器语言,从高级语言到低级别的机器语言肯定是要经过翻译过程,这个过程大体的过程如下图所示: 在Unix系统中,从源文件到可执行目标文件是由编译驱动程序完

    2024年02月12日
    浏览(30)
  • 手机学习笔记之二:APKtool工具实现反编译-编译-签名全过程

            APKTool 是一个开源的、跨平台的反编译、回编译 Android 应用程序的工具。它能够将 APK 文件解压并还原成 Android 应用程序的资源文件和 Smali 代码,还能将修改后的资源文件和 Smali 代码重新打包成 APK 文件。APKTool 是 Android 应用程序开发和逆向开发的重要工具之一,它能

    2024年02月02日
    浏览(63)
  • 2023最全软件测试基础+字节大佬整理的面试笔记(超详细~)

    软件是计算机系统中的程序和相关文件或文档的总称。 说法一:使用人工或自动的手段来运行或测量软件系统的过程,以检验软件系统是否满足规定的要求,并找出与预期结果之间的差异。 说法二:软件测试就是利用一定的方法对软件的质量或者使用性进行判断和评估的过

    2024年02月09日
    浏览(38)
  • 【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言工程实践之测试 | 青训营 目录 一、概述 1、回归测试 2、集成测试 3、单元测试 二、单元测试 1、流程 2、规则 3、单元测试的例子 4、assert 5、覆盖率

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包