c语言程序段分类大全

2024-01-27 14:58
文章标签 语言 分类 大全 程序段

本文主要是介绍c语言程序段分类大全,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根据C语言的特点,每一个源程序生成的目标代码将包含源程序所需要表达的所有信息和功能。目标代码中各段生成情况如下:

1.代码段(Code)
        代码段由程序中的各个函数产生,函数的每一个语句将最终经过编译和汇编生成二进制机器代码(具体生成哪种体系结构的机器代码由编译器决定)。

        ? 顺序代码
        基本数学运算(+,-),逻辑运算(&&,||),位运算(&,|,^)等都属于顺序代码。

        ? 选择代码
        if,if…else语句等将由编译器生成选择代码。

        ? 循环代码
        while(),do…while()语句等将由编译器生成循环代码。

        对于一些较为复杂的数学运算如除法(/),取余(%)等,虽然它们是C语言的基本运算,但在各种编译系统中的处理方式却不一定相同。根据编译器和体系结构的特点,对它们的处理方式有可能与加减等运算相同,即直接生成处理器的机器代码,也有可能转换成一个库函数的调用。例如,在没有除法指令的体系结构中,编译器在编译a/b这类除法运算的时候,由于处理器没有与其对应的指令,因此会使用调用库函数来模拟除法运算。浮点数的处理与之类似:对于支持浮点运算的体系结构,将直接生成浮点代码;对于不支持浮点数的处理器,编译器将会把每一个浮点运算用库函数调用的方式模拟。

2.只读数据段(RO Data)

        只读数据段由程序中所使用的数据产生,该部分数据的特点是在运行中不需要改变,因此编译器会将该数据放入只读的部分中。C语言的一些语法将生成只读数据段。

        ? 只读全局量
        例如:定义全局变量const char a[100]={"ABCDEFG"}将生成大小为100个字节的只读数据区,并使用字串"ABCDEFG"初始化。如果定义为const char a[]={"ABCDEFG"},没有指定大小,将根据"ABCDEFG"字串的长度,生成8个字节的只读数据段。

        ? 只读局部量
        例如:在函数内部定义的变量const char b[100] ={"9876543210"};其初始化的过程和全局量一样。

        ? 程序中使用的常量
        例如:在程序中使用printf("information /n"),其中包含了字串常量,编译器会自动把常量"information /n"放入只读数据区。

        在const char a[100]={"ABCDEFG"}中,定义了100个字节的数据区,但是只初始化了前面的8个字节(7个字符和表示结束的'/0')。在这种用法中,实际后面的字节没有初始化,但是在程序中也不能写,实际上没有任何用处。因此,在只读数据段中,一般都需要做完全的初始化。

3.读写数据段(RW Data)

        读写数据段表示了在目标文件中一部分可以读也可以写的数据区,在某些场合它们又被称为已初始化数据段。这部分数据段和代码段,与只读数据段一样都属于程序中的静态区域,但是具有可写的特点。

        ? 已初始化全局静态变量
        例如:在函数外部,定义全局的变量char a[100]={"ABCDEFG"}

        ? 已初始化局部静态变量
        例如:在函数中定义static char b[100] ={"9876543210"}。函数中由static定义并且已经初始化的数据和数组将被编译为读写数据段。

        读写数据区的特点是必须在程序中经过初始化,如果只有定义,没有初始值,则不会生成读写数据区,而会定位为未初始化数据区(BSS)。如果全局变量(函数外部定义的变量)加入static修饰符,写为类似static char a[100]的形式,这表示只能在文件内使用,而不能被其他文件使用。

static用在变量上分两种情况,在一函数内部和在所有函数外,两者作用域不同,前者在函数内部有效,而后者在本文件有效,共同的特性就是存放在静态变量区而不是堆栈,因此每次合法调用时都会使用原来值和保存当前值。

4.未初始化数据段(BSS)
        未初始化数据段常被称之为BSS(英文Block Start by Symbol的缩写)。与读写数据段类似,它也属于静态数据区,但是该段中的数据没有经过初始化。因此它只会在目标文件中被标识,而不会真正称为目标文件中的一个段,该段将会在运行时产生。未初始化数据段只有在运行的初始化阶段才会产生,因此它的大小不会影响目标文件的大小。

在C语言的程序中,对变量的使用还有以下几点需注意:

        1.在函数体中定义的变量通常是在栈上,不需要在程序中进行管理,由编译器处理。

        2.用malloc,calloc,realloc等分配内存的函数所分配的内存空间在堆上,程序必须保证在使用后用free释放,否则会发生内存泄漏。

        3.所有函数体外定义的是全局变量,加了static修饰符后的变量不管在函数内部或者外部都存放在全局区(静态区)。

        4.使用const定义的变量将放于程序的只读数据区。

        在C语言中,可以定义static变量:在函数体内定义的static变量只能在该函数体内有效;在所有函数体外定义的static变量,也只能在该文件中有效,不能在其他的源文件中使用;对于没有使用static修饰的全局变量,可以在其他的源文件中使用。这些区别是编译的概念,即如果不按要求使用变量,编译器会报错。使用static和没有使用static修饰的全局变量最终都将放置在程序的全局区(静态区)。

这篇关于c语言程序段分类大全的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/650583

相关文章

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

C语言中自动与强制转换全解析

《C语言中自动与强制转换全解析》在编写C程序时,类型转换是确保数据正确性和一致性的关键环节,无论是隐式转换还是显式转换,都各有特点和应用场景,本文将详细探讨C语言中的类型转换机制,帮助您更好地理解并在... 目录类型转换的重要性自动类型转换(隐式转换)强制类型转换(显式转换)常见错误与注意事项总结与建议类型

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3