C语言概述

目录

​编辑

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_startprocpushl   %ebp.cfi_def_cfa_offset 8.cfi_offset 5, -8movl    %esp, %ebp.cfi_def_cfa_register 5andl    $-16, %espsubl    $32, %espmovl    $2, 20(%esp)movl    $3, 24(%esp)movl    24(%esp), %eaxmovl    %eax, 4(%esp)movl    20(%esp), %eaxmovl    %eax, (%esp)call    add movl    %eax, 28(%esp)movl    28(%esp), %eaxmovl    %eax, 12(%esp)movl    24(%esp), %eaxmovl    %eax, 8(%esp)movl    20(%esp), %eaxmovl    %eax, 4(%esp)movl    $.LC0, (%esp)call    printfleave.cfi_restore 5.cfi_def_cfa 4, 4ret .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.rhkb.cn/news/188503.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

钉钉统计部门个人请假次数go

前言 最近小组需要统计部门各种请假次数,写了一个方法,第一次实战中用到递归函数,简单记录一下。 效果展示 这些数据不需要返回json,这里这样是为了方便测试。可以通过这些数据完成其它的操作。 功能实现 钉钉服务端调试工具A…

Spring -Spring之循环依赖源码解析

什么是循环依赖? 很简单,就是A对象依赖了B对象,B对象依赖了A对象。 比如: // A依赖了B class A{public B b; }// B依赖了A class B{public A a; }那么循环依赖是个问题吗? 如果不考虑Spring,循环依赖并…

【神经网络】GAN:生成对抗网络

GAN:生成对抗网络 Generator(生成器)概念 和传统的神经网络不同,Generator除了接受x的输入之外,还会接受一个简单的分布作为z进行输入,从而使得网络的输出也是一个复杂的分布 为什么输出需要时一个分布呢…

关于session的不断变化问题

今天在帮同学解决一个小问题,差点阴沟翻船。 问题再现:他从github上拉了一个项目下来跑,结果发生跑不通问题出现在验证码一直不对。 我一看项目源码,验证码生成后存储再session中了,等用户发送请求验证的时候sessionI…

【刷题】力扣每日一题 : 381、2300、765

前言 本篇文章用于记录在做力扣每日一题的时候遇到的一些知识点以及自己的思路 381 题干 题目链接 我的思路及做题过程 思路1 我的想法是 记录每个字符串的字母出现个数 然后比较两个字符串是否有字母同时出现 class Solution { public:int judge(string s1, string s2…

vscode因为大文件而无限崩溃的问题,窗口意外终止(原因:“oom“,代码:“-536870904“

复制了一大堆的代码(好几兆)到一个文件里,然后就导致 vscode 卡死, 之后就算把该文件删掉了,打开vscode还是会默认打开该文件而卡死 解决办法: win R 输入 %appdata%/code/ 删除该文件夹下的 backups/ 文件…

索尼RSV文件怎么恢复为MP4视频

索尼相机RSV是什么文件? 如果您的相机是索尼SONY A7S3,A7M4,FX3,FX3,FX6,或FX9等,有时录像会产生一个RSV文件,而没有MP4视频文件。RSV其实是MP4的前期文件,经我对RSV文件…

CSS特效006:绘制不断跳动的心形

css实战中,怎么绘制不断跳动的心形呢? 绘图的时候主要用到了transform: rotate(-45deg); transform-origin: 0 100%; transform: rotate(45deg); transform-origin: 100% 100%; 动画使用keyframes 时间上为infinite。 效果图 源代码 /* * Author: 大剑…

切换数据库的临时表空间为temp1 / 切换数据库的undo表空间为 undotbs01

目录 ​编辑 一、切换临时表空间 1、登录数据库 2、查询默认临时表空间 3、创建临时表空间temp1(我们的目标表空间) 4、修改默认temp表空间 5、查询用户默认临时表空间 6、命令总结: 二、切换数据库的undo表空间 1、查询默认undo表…

【iOS开发】iOS App的加固保护原理:使用ipaguard混淆加固

​ 摘要 在开发iOS应用时,保护应用程序的安全是非常重要的。本文将介绍一种使用ipaguard混淆加固的方法来保护iOS应用的安全。通过字符串混淆、类名和方法名混淆、程序结构混淆加密以及反调试、反注入等主动保护策略,可以有效地保护应用程序的安全性。 …

SparkSQL语法优化

SparkSQL在整个执行计划处理的过程中,使用了Catalyst 优化器。 1 基于RBO的优化 在Spark 3.0 版本中,Catalyst 总共有 81 条优化规则(Rules),分成 27 组(Batches),其中有些规则会被归…

2.docker镜像的导入导出

目录 概述docker 常用命令下载导出导入镜像结束 概述 docker 常用命令 本章节使用到的命令,总结在此,后面有使用案例。 命令作用docker images显示镜像docker rmi $(docker images -q)删除系统上所有的镜像docker rmi -f强制删除多个镜像 &#xff1a…

LeetCode146.LRU缓存

写了一个小时,终于把示例跑过了,没想到啊提交之后第19/22个测试用例没过 我把测试用例的输出复制在word上看看和我的有什么不同,没想到有18页的word,然后我一直检查终于找出了问题,而且这个bug真的太活该了&#xff0c…

云栖大会丨桑文锋:打造云原生数字化客户经营引擎

近日,2023 云栖大会在杭州举办。今年云栖大会回归了 2015 的主题:「计算,为了无法计算的价值」。神策数据创始人 & CEO 桑文锋受邀出席「生态产品与伙伴赋能」技术主题,并以「打造云原生数字化客户经营引擎」为主题进行演讲。…

男科医院服务预约小程序的作用是什么

医院的需求度从来都很高,随着技术发展,不少科目随之衍生出新的医院的,比如男科医院、妇科医院等,这使得目标群体更加精准,同时也赋能用户可以快速享受到服务。 当然相应的男科医院在实际经营中也面临痛点:…

微服务-我对Spring Clound的理解

官网:https://spring.io/projects/spring-cloud 官方说法:Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理、服务发现、熔断器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、分布式会话…

什么是Amazon Simple Email Service(SES 群发邮件)

Amazon Simple Email Service(Amazon SES)让您可以使用 Amazon SES API 或 SMTP 接口放心地联络到客户,而无需使用本地简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)电子邮件服务器。 目录 什么是…

最新支付宝转卡码生成之转账源代码(隐藏部分卡号)

一、需要准备好自己的卡号、名称、以及对应的姓名 二、然后将自己的信息填入下面的代码中 三、然后将拼接好的代码,利用转码技术生产对应的二维码 四、这样一个跳转银行卡二维码的转账码就做好了 效果演示:如下 支付宝扫码、跳转码、转卡码、隐藏卡号…

classification_report分类报告的含义

classification_report分类报告 基础知识混淆矩阵(Confusion Matrix)TP、TN、FP、FN精度(Precision)准确率(Accuracy)召回率(Recall)F1分数(F1-score) classi…

Linux编辑器---vim的使用

Vim是一个高度可配置的文本编辑器,它是操作Linux的一款利器,旨在高效地创建和更改任何类型的文本。这款编辑器起源于"vi",并在此基础上发展出了众多新的特性。Vim被普遍推崇为类Vi编辑器中最好的一个,事实上真正的劲敌来…