C语言概述

news2025/1/13 19:52:06

目录

​编辑

1.  C语言发展史

2.  C语言特点

3.  C语言标准

4.  C语言编程机制

4.1  预处理(Preprocessing)

4.2  编译(Compilation)

4.3  汇编(Assemble)

4.4  链接(Linking)

结语


1.  C语言发展史

        C语言是由美国贝尔实验室的Dennis Ritchie于1972年设计开发的一种编程语言,它的设计目标是用于Unix操作系统的程序开发。

        在20世纪70年代末和80年代初,C语言逐渐成为主流的编程语言之一。它的广泛应用在于其简单易学、功能强大、可移植性强的特点,使得许多计算机公司和软件开发者将其作为首选语言。

        1990年代中期,C++语言的出现逐渐压过了C语言的优势。尽管如此,C语言仍然是许多高性能应用程序的编程语言,包括操作系统、嵌入式系统和设备驱动程序等。

        近年来,由于其广泛应用和高度成熟的编译器、文档和支持工具,C语言仍然是许多计算机科学教育课程的核心部分。此外,许多新的C语言标准和框架也在不断推出,以满足不断变化的编程需求。

2.  C语言特点

  1. 结构化编程:C语言采用结构化编程的思想,代码结构清晰简洁,易于理解和维护。

  2. 代码可移植性:C语言的编译器可以在多种平台上运行,代码可以在不同的操作系统和硬件上运行,具有很好的可移植性。

  3. 高效性:C语言的编译器生成的代码执行效率高,能够直接操作计算机硬件,利用底层资源,具有高效性。

  4. 指针:C语言具有指针的概念,可以直接访问内存地址,实现高效的数据操作。

  5. 库函数丰富:C语言提供了丰富的标准库函数,能够方便地实现各种功能,如字符串操作、文件操作等。

  6. 可扩展性:C语言可以使用其他语言编写的库文件,扩展其功能。

  7. 低级别控制:C语言具有低级别的控制能力,用户可以直接控制内存、硬件等底层资源,实现灵活的编程。

  8. 面向过程:C语言是一种面向过程的编程语言,适合于开发底层的系统软件和高效的算法。

        通过上述的介绍,已经了解了C语言的若干特点。C语言虽然是一种优秀的计算机程序设计语言,但也存在以下的一些缺点,了解这些缺点,才能够在实际使用中扬长避短。
    1. C程序的错误更隐蔽。C语言的灵活性使得用它编写程序时更容易出错,而且C语言的编译器不检查这样的错误。与汇编语言类似,需要程序运行是才能发现这些逻辑错误。C语言还会有一些隐患,需要程序员重视,比如将比较的"=="写成赋值"=",语法上没有错误,这样的逻辑错误不易发现,要找出来往往十分费时。
    2. C程序有时会难以理解。C语言语法成分相对简单,是一种小型语言。但是,其数据类型多,运算符丰富且结合性多样,使得对其理解有一定的难度。有关运算符和结合性,人们最常说的一句话是“先乘除,后加减,同级运算从左到右”,但是C语言远比这要复杂。发明C语言时,为了减少字符输入,C语言比较简明,同时也使得C语言可以写出常人几乎无法理解的程序。
    3. C程序有时会难以修改。考虑到程序规模的大型化或者说巨型化,现代编程语言通常会提供“类”和“包”之类的语言特性,这样的特性可以将程序分解成更加易于管理的模块。然而C语言缺少这样的特性,维护大型程序显得比较困难。

3.  C语言标准

        C语言标准通常指ISO/IEC 9899:C99或ISO/IEC 9899:C11。这些标准定义了C程序语言的语法、语义、库等的规范。C99是C语言的第二个国际标准,于1999年发布,引入了许多新功能,如可变长度数组、复合文字和行注释等,C11于2011年发布,进一步扩展了C99,并添加了一些新功能,如泛型选择和多线程库等。

4.  C语言编程机制

        编程机制是指在计算机程序中使用的各种规则和技术,包括程序设计、算法、数据结构、编程语言、编码标准、调试和测试等方面。其中,程序设计是编程机制的核心,它涉及到如何组织和设计程序的核心逻辑和数据结构,以及如何在其中使用编程语言和库。算法则是指在程序中描述问题的解决方案的过程或序列,数据结构则是指程序中用于存储和操作数据的方式。编程语言则提供了一种语法和语义规则来实现特定的编程机制,编码标准则规定了程序如何编写、格式化和文档化。调试和测试等技术则用于发现和修复程序中的错误和缺陷。综合使用这些机制可以编写高效、可靠、可维护和易于使用的程序。

C语言是一种基于过程的编程语言,具有以下几个基本机制:

  1. 结构化编程:C语言通过控制结构(如if-else、while、for等)来组织代码,实现结构化编程,使代码清晰、易于理解和修改。

  2. 函数:C语言中的函数是一个独立的代码块,接受一些输入参数并返回一个输出值。通过函数,可以将代码分解成小的模块,提高了代码的可读性和可维护性。

  3. 指针:指针是C语言中的一种重要数据类型,可以指向内存中的地址,允许对内存中的数据进行直接访问和操作。指针在C语言中被广泛使用,可以用来实现高效的数据结构和算法。

  4. 数据类型:C语言中定义了基本的数据类型,如整数、字符、浮点数等,也可以通过结构体和联合体来自定义复杂的数据类型,以满足不同的需求。

  5. 预处理器:C语言中的预处理器可以在编译代码之前对代码进行一些预处理,如包含头文件、定义常量、条件编译等,可以使代码更加灵活和可配置。

以上这些机制共同构成了C语言的编程范式,使其成为一种高效、灵活、可扩展的编程语言。

4.1  预处理(Preprocessing)

        预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。gcc的预处理是预处理器cpp来完成的,你可以通过如下命令对test.c进行预处理:

gcc -E -I./inc test.c -o test.i

        或者直接调用cpp命令

$ cpp test.c -I./inc -o test.i

        上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-I指定头文件目录,这里指定的是我们自定义的头文件目录;-o指定输出文件名。

经过预处理之后代码体积会大很多:

X文件名文件大小代码行数
预处理前test.c146B9
预处理后test.i17691B857

预处理之后的程序还是文本,可以用文本编辑器打开。

4.2  编译(Compilation)

        这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。编译的指定如下:

$ gcc -S -I./inc test.c -o test.s

        上述命令中-S让编译器在编译之后停止,不进行后续过程。编译过程完成后,将生成程序的汇编代码test.s,这也是文本文件,内容如下:

// test.c汇编之后的结果test.s
    .file   "test.c"
    .section    .rodata
.LC0:
    .string "a=%d, b=%d, a+b=%d\n"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $32, %esp
    movl    $2, 20(%esp)
    movl    $3, 24(%esp)
    movl    24(%esp), %eax
    movl    %eax, 4(%esp)
    movl    20(%esp), %eax
    movl    %eax, (%esp)
    call    add 
    movl    %eax, 28(%esp)
    movl    28(%esp), %eax
    movl    %eax, 12(%esp)
    movl    24(%esp), %eax
    movl    %eax, 8(%esp)
    movl    20(%esp), %eax
    movl    %eax, 4(%esp)
    movl    $.LC0, (%esp)
    call    printf
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret 
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2"
    .section    .note.GNU-stack,"",@progbits

请不要问我上述代码是什么意思!-_-

4.3  汇编(Assemble)

        汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。gcc汇编过程通过as命令完成:

$ as test.s -o test.o

等价于:

gcc -c test.s -o test.o

这一步会为每一个源文件产生一个目标文件。因此mymath.c也需要产生一个mymath.o文件

4.4  链接(Linking)

链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)

命令大致如下:

$ ld -o test.out test.o inc/mymath.o ...libraries...

结语

        经过以上分析,我们发现编译过程并不像想象的那么简单,而是要经过预处理、编译、汇编、链接。尽管我们平时使用gcc命令的时候没有关心中间结果,但每次程序的编译都少不了这几个步骤。也不用为上述繁琐过程而烦恼,因为你仍然可以:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1198027.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

keil和proteus联动要点

一、keil与proteus如何进行联动? 1.先安装vdmagdi.exe,这是驱动 2.要保证keil工程编译通过,左上角红色图标进行编译,黑色框图标进行链接。 3.生成hex文件 先点击这个图标 按照顺序点击,生成HEX文件。 4.在打开的prot…

Windows 11系统cmd终端美化、Vscode终端美化

win11美化cmd终端和vscode的终端 1. 修改终端背景2. oh-my-posh2.1 安装oh-my-posh2.2 安装Clink2.3 Clink配置oh-my-posh2.4 下载和配置Nerd字体2.5 修改美化主题 3. vscode终端美化 电脑默认的终端没有语法高亮这些,运行命令和代码输出字体一样,有时会…

【数据结构】归并排序

#include<iostream>using namespace std;void Merge(int* arr,int left,int right,int mid, int*& tmparr) {int begin1 left, end1 mid;int begin2 mid 1, end2 right;int tmpi left;//下面合并两个数组为一个有序数组&#xff08;升序&#xff09;&#xff1…

测试开源加解密库NETCore.Encrypt中的RSA加解密函数

微信公众号“dotNET跨平台”的文章《开箱即用&#xff0c;.NET最全的加解密开源库》介绍了开源通用工具库NETCore.Encrypt&#xff0c;其支持对称加密算法、非对称加密算法、摘要算法等多种常用算法&#xff0c;使用方便&#xff0c;不过目前仅支持.net core。本文主要测试调用…

vue-入门介绍

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容,初识vue入门到项目实战详解 目录 一.Vue介绍 二.初识Vue 工具安装 创建项目 目录结构介绍 项…

主题模型LDA教程:一致性得分coherence score方法对比(umass、c_v、uci)

文章目录 主题建模潜在迪利克雷分配&#xff08;LDA&#xff09;一致性得分 coherence score1. CV 一致性得分2. UMass 一致性得分3. UCI 一致性得分4. Word2vec 一致性得分5. 选择最佳一致性得分 主题建模 主题建模是一种机器学习和自然语言处理技术&#xff0c;用于确定文档…

文心耀乌镇,“大模型之光”展现了什么?

“乌镇的小桥流水&#xff0c;能照见全球科技的风起云涌。” 多年以来&#xff0c;伴随着中国科技的腾飞&#xff0c;以及世界互联网大会乌镇峰会的连续成功举办&#xff0c;这句话已经成为全球科技产业的共识。乌镇是科技与互联网的风向标、晴雨表&#xff0c;也是无数新故事开…

2023-11-11 LeetCode每日一题(情侣牵手)

2023-11-11每日一题 一、题目编号 765. 情侣牵手二、题目链接 点击跳转到题目位置 三、题目描述 n 对情侣坐在连续排列的 2n 个座位上&#xff0c;想要牵到对方的手。 人和座位由一个整数数组 row 表示&#xff0c;其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺…

SQL必知会(二)-SQL查询篇(4)-高级过滤

第5课、高级过滤 组合 WHERE 子句 AND OR&#xff1a;与条件、或条件 多个 WHERE 子句有两种使用方式&#xff1a;AND 子句 或 OR 子句。 1&#xff09;AND 操作符 AND 相当于编程语言中的与条件。 需求&#xff1a;如果某个产品由供应商 DLL01 制造&#xff0c;但价格不高…

java项目之共享充电宝管理系统(ssm框架)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的共享充电宝管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 管理员&#xff1a;首页、个…

Shell编程入门--概念、特性、bash配置文件

目录 一、Shell概念1.定义2.分类和使用场景2.1.分类和切换2.2.使用场景 3.特性3.1.文件描述符与输出重定向3.2.历史命令---history3.3.别名 --alias3.4.命令排序执行3.5.部分快捷键3.6.通配符置换 4.脚本规范5.脚本运行方式5.1.bash脚本执行5.2.bash脚本测试 二、bash配置文件1…

Oracle(18)Auditing

文章目录 一、基础知识1、审计介绍2、Auditing Types 审计类型3、Auditing Guidelines 审计准则4、Auditing Categories 审核类别5、Database Auditing 数据库审计6、Auditing User SYS 审计sys用户7、Getting Auditing Informatio 获取审计信息8、获取审计记录通知 二、基础操…

(三)、MySQL索引

一、索引基础 索引是存储引擎用于快速找到记录的一种数据结构。(可以理解为一本书的目录)。 例子&#xff1a;where id1 如果在id列上建有索引&#xff0c;则MySQL将使用该索引找到id为1的行&#xff0c;也就是说&#xff0c;MySQL先在索引上按值进行查找&#xff0c;然…

Java10新增特性

版本介绍 Java 10 的发布时间是2018年3月20日。这是在Java 9之后&#xff0c;采用了基于时间发布的策略&#xff0c;每6个月一个版本。这是采用新的发布策略之后的第一个版本。 Java 10 是Java版本历史上最快的一个版本。它打破了Java缓慢增长和进化的概念。它是一个具有许多…

【树与二叉树的转换,哈夫曼树的基本概念】

文章目录 树与二叉树的转换将二叉树转化为树森林与二叉树的转化&#xff08;二叉树与多棵树之间的关系&#xff09;二叉树转换为森林森林的先序遍历1&#xff09;先序遍历2&#xff09;后序遍历 哈夫曼树的基本概念森林转换成二叉树&#xff08;二叉树与多棵树的关系&#xff0…

Sensor 点亮出图后,颜色偏红或者偏绿是为什么?

这是因为 sensor balck level 的值配置的不正确导致&#xff0c;black level 的值一般在效果参数的 calibration 参数里面。 在驱动调试阶段&#xff0c;我们一般都是复用其他已调试好的&#xff0c;sensor 的驱动文件及效果文件&#xff0c; 而不同 sensor 的 balck level 的…

YOLOv8-Seg改进:分割注意力系列篇 | 高效的通道先验卷积注意力(CPCA) | 中科院 2023.6

🚀🚀🚀本文改进:高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布; 🚀🚀🚀CPCA 小目标分割检测&复杂场景首选,实现涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新…

奇舞周刊第510期:浏览器和图形引擎渲染对比

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 浏览器和图形引擎渲染对比 本文从介绍浏览器渲染引擎开始&#xff0c;逐渐引出和图形引擎的比较&#xff0c;尝试从图形视角探索和理解浏览器的渲染原理。 Next.js的崛起&#xff…

消息队列使用场景

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 知足知不足 有为有不为 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录消息队列使用场景&#xff0c;如有出入还望…

基于STC12C5A60S2系列1T 8051单片机串口通信信应用

基于STC12C5A60S2系列1T 8051单片机串口通信应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器列表基于STC12C5A60S2系列1T 8051单片…