1-01初识C语言

一、概述

C语言是贝尔实验室的Ken Thompson(肯·汤普逊)、Dennis Ritchie(丹尼斯·里奇)等人开发的UNIX 操作系统的“副产品”,诞生于1970年代初。

Thompson和Ritchie共同创作完成了Unix操作系统,他们都被称为**“Unix之父”**。

如果你非要较真谁才是“C语言之父”,那么普遍而言,Dennis Ritchie被认为是**“C语言之父”**。

为了表彰他们在**“Unix操作系统的设计和实现,以及与之相关的C语言的开发”上的贡献,Dennis Ritchie 和 Ken Thompson 在1983年共同获得了图灵奖**。

Thompson(左)和Ritchie(右)

除此之外,Thompson还是“UFT-8编码”和“Go语言”的主要发明设计者。

二、C语言历史

2.1 诞生

上世纪60年代末,Thompson独自编写出了最初版本的Unix操作系统。Unix系统最初是用汇编语言编写的,用汇编语言编写的程序往往难以调试,也不易于进行扩展和移植。

Thompson意识到需要用一种更加高级的编程语言来完成Unix系统未来的开发,于是他设计了一种小型语言——B语言。B语言是在BCPL语言(20世纪60年代中期产生的一种系统编程语言)的基础上,简化开发而来的。

不久,Ritchie也加入到Unix项目中,并且开始着手用B语言编写程序。1970年,贝尔实验室为Unix项目争取到一台PDP-11计算机(一款在70年代非常成功的小型计算机)。当B语言经过改进并能够在PDP-11计算机上运行后,Thompson用B语言重新编写了部分UNIX代码。

到了1971年,B语言由于效率和功能上的局限性,已经明显不适合PDP-11计算机了,于是Ritchie着手开发B语言的升级版。最初,他将新开发的语言命名为NB语言(意为“New B”),但是后来新语言越来越偏离B语言,于是他将其改名为C语言。

这样C语言就诞生了,C语言的前身是B语言,而C语言的发明者是Dennis Ritchie。

到了1973年,C语言已经基本完善和稳定,Ritchie和Thompson把Unix系统的大部分组件都使用C语言进行了重写。这既证明了C语言在系统编程上的强大功能,也奠定了Unix系统的地位。

使用C语言重写Unix是一个关键决策,它为Unix的成功和普及打下了坚实的基础,使得Unix成为了一个扩展性强、可移植性强、易于开发维护的操作系统。

2.2 发展

1978年,Dennis Ritchie和Brian Kernighan(布莱恩·克尼汉)共同出版了书籍《C编程语言(The C Programming Language)》。这本书中描述的C语言版本经常被称为**“K&R C”**,可以认为这是最早的统一C语言版本。

图 3. Kernighan(左)和Ritchie(右)Kernighan(左)和Ritchie(右)

到了80年代,C语言走出贝尔实验室,被广泛使用。不同的机构间,往往会在原有基础上自己扩展一些C语法,这就是“C方言”。

为了确保C语言的一致性和可靠性,美国国家标准协会(ANSI)于1983年设立了一个委员会来标准化C语言。最终,该组织在1989年推出了ANSI C标准,也称为C89或ANSI C

不久之后,到了1990年,国际标准化组织(ISO)采纳了这一标准,并在1990年发布了这个C语言版本,被称为C90。**事实上,C89和C90就是两个相同的C语言标准,只是由不同的组织在不同的时间发布罢了。**C89/C90是第一个官方统一标准认证的C语言版本。

在这之后,C语言的官方标准版本的发布,都由ISO机构下的C语言相关工作组WG14完成。

1999年,C99发布。引入了如内联函数、新的数据类型、变长数组等新特性。

2011年,C11发布。增加了并发支持、类型通用宏、静态断言等新特性。

2018年,C18发布。主要是对C11进行小维护和小修正,没有引入新特性。可以认为C18就是C11的小更新版本。

在实际的应用中,C99虽然年代久远,但稳定可靠且足够好用,是比较常用的C语言版本。

除此之外,C11增加了对现代计算机操作系统的支持,特别是关于线程、并发部分的支持,所以在需要这些特性的C语言程序中,会优先选择C11。

总得来说,到目前为止,C99和C11在商业环境中是最常用的版本。

在我们的课程设计中,第一周的C语言部分我们只学习最基础的C语言语法,并不会涉及到C11的新特性。所以第一周学习C语言的课程将采用C99作为学习的C语言版本。

三、C语言的优点/优势

当今互联网世界是建立在C语言的基础上的

例如:

  1. 操作系统。C语言设计的初衷就是用来编写操作系统,目前所有的主流操作系统内核,所采用的编程语言都是C语言。
  2. 网络协议栈。一般和内核采用相同的语言实现,也就是C语言。
  3. Web服务器/HTTP服务器。Apache、Nginx主要由C语言编写。Tomcat(Java编写,仅运行Java应用)
  4. 关系型数据库。PostgreSQL、SQLite主要由C语言编写。MySQL(C/C++)
  5. 非关系型数据库。Redis主要由C语言编写。MongoDB(C++)、Elasticsearch(Java)

C语言是一门接近"低级语言"的"中级语言"

所谓"中级"编程语言,是要比较的,参看下图:

图 4. C语言是"中级语言"C语言是"中级语言"

这意味着C语言有以下优点:

  1. **C语言是一门接近硬件层面的编程语言,提供了接近硬件的操作能力。**C语言通过提供直接内存访问、指针操作和系统调用等功能,允许程序员以接近硬件的方式编写代码。这种能力使得C语言特别适用于嵌入式系统开发以及系统级编程。
  2. C语言拥有在所有编程语言中几乎独一档的高运行效率。
    1. C语言提供了接近硬件的操作能力,这意味着C程序可以更好的利用硬件资源。
    2. C语言编译器将源代码直接编译成机器代码(或非常接近的汇编语言),而非解释执行或编译为中间代码。
    3. **C语言还提供了各种特性使得程序员可以控制优化C程序的几乎每一个细节。**比如C语言的手动内存分配控制,这意味着可以精确地管理资源使用,从而提高效率。
    4. 在平均一般情况下,如果一个C程序的执行速度是100%,那么:
      • C++可能由于复杂性的影响,性能会轻微下降,一般是95%左右。
      • Java由于JVM等特性的影响,运行效率一般低于C/C++,大概在50%-80%范围内。
      • Python是一种脚本语言,需要解释执行,效率很差。可能在5%-30%之间。
  3. **C语言的语法非常简洁,没有太多复杂的特性。**作为一门接近硬件的编程语言,C语言的抽象层次很低,没有很多高级的抽象特性。这使得C语言简单易学,同时对于想要深入理解计算机原理的人来说,C语言的低抽象性也可以使得学习者可以更好的忽略语言特性,关注具体原理。
  4. C语言作为一门"中级语言",市面上流行的编程语言基本都可以找到它的影子(C-like语言),所以学习C语言对于学习其他编程语言也有很大的帮助。

C语言是一门从诞生到现在,一直都非常流行的编程语言

C语言的生命力旺盛,从诞生到如今始终都是最流行的开发语言之一。

可以参考:TIOBE世界编程语言排行榜

四、C语言的缺点

很多时候,一个优点往往同步带来一些缺点,C语言实际上是一门缺点很明显的编程语言。正如丹尼斯·里奇(Dennis M. Ritchie),C语言的主要发明者,曾经评价C语言说:

C is quirky, flawed, and an enormous success.

这句话直译为:“C语言是古怪的、有缺陷的,但同时取得了一个巨大的成功。”

C语言有以下突出的缺点:

  1. **C语言是一门非常容易出错,却非常不容易发现错误的编程语言。**这主要是因为:
    1. C语言的语法相对非常宽松和灵活,给予了程序员很大的自由度,但出错的概率也大大增加了。
    2. C语言给程序员很大的自主性和控制权限,但即便是熟练的C程序员也无法保证能够完美的控制程序。比如内存管理,手动的内存管理不仅增加了编程的复杂性,而且非常容易出错,如内存泄漏和使用未初始化的内存导致未定义行为。
    3. C语言追求效率,所以没有专门的异常机制来指示程序出现的问题。C程序甚至不会去检查数组下标越界的问题。
  2. C语言缺少一些必要的高级特性,使得C程序的可维护性很差。一个复杂的C程序,如果在设计之初没有考虑到维护问题,那么将很难对它做出修改或扩展。(这也是C++出现的目的)
  3. 相比较现代的高级语言,C语言经常可以写出可读性十分差的代码。
    1. 这一方面是由于C语言作为一门小型语言,它缺乏一些现代高级语言中的特性,并且其标准库相对较小。因此,程序员往往需要自行编写复杂的代码实现,这些代码对于其他人可能难以理解。
    2. 另一方面,C语言诞生于编程发展的初期,那时的编程哲学倾向于代码的极致简洁性。这种风格有时会导致代码过于晦涩难懂,尤其是当程序员过分追求聪明的技巧时,可能会编写出只有自己能理解的代码。
    3. 在现代编程中,尤其是团队协作环境下,高度重视代码的可读性和维护性。因此,在我们的课堂上,我们会强调编写清晰易读的C代码,而不是单纯追求代码的简洁。

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

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

相关文章

可编程线性霍尔传感器 IC

一、产品概述 CC6521/2 是一款高性能的可编程线性霍尔传感器 IC,采用先进的 BiCMOS 制程生产,具有霍尔系数高的优点,芯片内部包含了高灵敏度 霍尔传感器,霍尔信号预放大器,高精度的霍尔温度补偿单元,振荡…

【博士每天一篇文-算法】Graph Structure of Neural Networks

阅读时间:2023-11-12 1 介绍 年份:2020 作者:尤家轩 斯坦福大学 期刊: International Conference on Machine Learning. 引用量:130 论文探讨了神经网络的图结构与其预测性能之间的关系。作者提出了一种新的基于图的…

2024-01-01 K 次取反后最大化的数组和和加油站以及根据身高重建队列

1005. K 次取反后最大化的数组和 思路:每一次取反最小值即可!贪心的思路就是先排序,反转负数的值,后在贪心反转最小值 class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:count 0while …

Unity中URP下开启和使用深度图

文章目录 前言一、在Unity中打开URP下的深度图二、在Shader中开启深度图1、使用不透明渲染队列才可以使用深度图2、半透明渲染队列深度图就会关闭 三、URP深度图 和 BRP深度图的区别四、在Shader中,使用深度图1、定义纹理和采样器2、在片元着色器对深度图采样并且输…

LeetCode刷题--- 最小路径和

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述动…

setup 语法糖

只有vue3.2以上版本可以使用 优点: 更少的样板内容,更简洁的代码 能够使用纯 Typescript 声明props 和抛出事件 更好的运行时性能 更好的IDE类型推断性能 在sciprt标识上加上setup 顶层绑定都可以使用 不需要return ,可以直接使用 使用组件…

Redis异步写失败后补数逻辑设计

背景 最近各种机房事故频发,所以很多公司都对Redis存储等进行异步多活,我们公司采用的方式是通过客户端双写的方式来实现异地Redis机房的备份,但是当异地机房出现临时网络故障时,就涉及到了如何进行补数的操作,本文就…

理解Herbrand Equivalence

笔者最近在看GVN的一系列论文,总会看到一个概念叫Herbran Equivalence,依靠这种定义,能够判断一个GVN算法是否是complete的,也即检测一个算法是否是precise的,只有找到所有Herbrand Equivalence关系的算法才能称得上是…

2024.1.10

完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&#xf…

01-你好Python-python环境安装 python解释器的安装 pycharm的安装

python环境安装 官方网址:https://python.org 这里可以下载最新版本的,下载完成以后在自己的浏览器文件下载的文件夹中找到该文件 下载速度可能会比较慢,这里已经提供好了文件,可以直接点击安装 点击Customize installation 点击…

pulsar的架构与特性记录

一、什么是云原生 云原生的概念是2013年Matt Stine提出的,到目前为止,云原生的概念发生了多次变更,目前最新对云原生定义为: Devps持续交付微服务容器 而符合云原生架构的应用程序是: 采用开源堆栈(K8SDocker)进行容器化,基于微服务架构提高灵…

人工智能利用深度学习技术增强高级驾驶辅助系统(ADAS)

深度学习通过实时传感器数据增强高级驾驶辅助系统(ADAS),实现精确的物体检测、碰撞预测和主动决策。 人工智能和机器学习利用深度学习技术的优势,使高级驾驶辅助系统(ADAS)发生了重大变革。ADAS在很大程度上依赖深度学习来分析和解释从各种传感器获得的…

Flutter 中使用 ICON

Flutter Icon URL : https://fonts.google.com/icons: 在Flutter中使用 Icon 步骤如下: 导入图标库 在Dart 文件中导入 material.dart 包,该包包含了 Flutter 的图标库。 import package:flutter/material.dart;使用图标组件 …

救赎之道,就在其中

时光荏苒,不知不觉距离我踏入职场的第一天已经快一年了。最近也是看到平台举办年度征文活动,借此契机重新审视自己这两年来的成长历程,也希望对正在迷茫的人提供一些精神上的慰藉。 1.对未来的迷茫 如果要给两年前的自己打上标签&#xff0…

在IntelliJ IDEA上使用通义灵码(TONGYI Lingma)

参考链接: 通义灵码产品介绍_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 【IDEA如何使用通义灵码?】_idea 通义灵码-CSDN博客 1. 简介 1.1 定义 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提…

实现多级缓存(Redis+Caffeine)

文章目录 多级缓存的概述多级缓存的优势 多级缓存的概述 在高性能的服务架构设计中,缓存是一个不可或缺的环节。在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中,只有当缓存的访问没有命中时再查询数据库。在…

【UE Niagara学习笔记】06 - 制作火焰喷射过程中飞舞的火星

在上一篇博客(【UE Niagara学习笔记】05 - 喷射火焰顶部的蓝色火焰)的基础上继续实现喷射火焰的火星的效果。 目录 效果 步骤 一、创建材质实例 二、添加新的发射器 2.1 设置粒子材质 2.2 设置发射器持续生成粒子 2.3 设置粒子生成数量 2.4 设…

前端项目构建打包生成Git信息文件

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、前端项目构建打包生成Git信息文件作用二、步骤1.引入相关的npm包1.1. **fs** 包1.2. **child_process** 包1.3. **os** 包 (非必须 如果你想生成的文件信息中包含当前电脑信息则可用)1.4. **path** 包…

MySql -数据库基本概念

一、数据库的基本概念 1.为什么要学数据库? 之前我们如果想将一些数据实现永久化存储,可以怎么做呢?没错。使用IO流的技术将数据保存到本地文件中但是接下来我有这样一个需求:将下面的user.txt文件中的王五年龄修改为35 张三 2…

视频智能剪辑方案,企业视频制作新时代

视频已经成为了人们获取信息、娱乐和学习的重要方式。然而,传统的视频制作过程繁琐且耗时,这对于许多企业来说无疑是一个巨大的挑战。为了解决这个问题,美摄科技凭借其在机器学习、深度学习等AI算法方面的深厚积累,自主研发了一套…