当前位置: 首页 > news >正文

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代码,而不是单纯追求代码的简洁。

相关文章:

1-01初识C语言

一、概述 C语言是贝尔实验室的Ken Thompson(肯汤普逊)、Dennis Ritchie(丹尼斯里奇)等人开发的UNIX 操作系统的“副产品”,诞生于1970年代初。 Thompson和Ritchie共同创作完成了Unix操作系统,他们都被称为…...

Python字符串

定义字符串 Python中要定义一个字符串,有比较多的一种方式。 示例代码: s "你好,张大鹏" print(s, type(s))s 你好,张大鹏 print(s, type(s))s """你好,张大鹏""" prin…...

PHP 基础编程 1

文章目录 前后端交互尝试php简介php版本php 基础语法php的变量前后端交互 - 计算器体验php数据类型php的常量和变量的区别php的运算符算数运算符自增自减比较运算符赋值运算符逻辑运算 php的控制结构ifelseelse if 前后端交互尝试 前端编程语言:JS (Java…...

Android studio BottomNavigationView 应用设计

一、新建Bottom Navigation Activity项目: 二、修改bottom_nav_menu.xml: <itemandroid:id="@+id/navigation_beijing"android:icon="@drawable/ic_beijing_24dp"android:title="@string/title_beijing" /><itemandroid:id="@+i…...

51单片机串行口相关知识

51单片机串行口相关知识 串行通信概念 计算机与外部通信方式就两种&#xff1a; 并行通信串行通信 两种通信方式的特点以及适用场景&#xff1a; 名称特点适用场景并行通信速度快&#xff0c;效率高&#xff0c;成本高适合短距离高速通信&#xff0c;如计算机内部各硬件之…...

IDEA 每次新建工程都要重新配置 Maven的解决方案

文章目录 IDEA 每次新建工程都要重新配置 Maven 解决方案一、选择 File -> New Projects Setup -> Settingsfor New Projects…二、选择 Build,Execution,Deployment -> Build Tools -> Maven IDEA 每次新建工程都要重新配置 Maven 解决方案 DEA 每次新建工程都要…...

SecOC中新鲜度值和MAC都按照完整的值来生成,但是在发送和认证的时候只会截取一部分。这边截取的部分一般取多长?由什么参数设定?

新鲜度值(Freshness Value, FV)和消息验证码(Message Authentication Code, MAC)是SecOC协议中用于保证数据的真实性和新鲜度的重要信息。它们的长度取决于不同的因素,如加密算法、安全级别、通信带宽等。 一般来说,FV和MAC的长度越长,安全性越高,但也会占用更多的通信…...

信源编码与信道转移矩阵

目录 一. 信息论模型 二. 点对点通信模型 三. 信源编码 四. 信道转移矩阵 4.1 二进制对称信道 4.2 二进制擦除信道 五. 小结 &#xff08;1&#xff09;信道直射与反射 &#xff08;2&#xff09;信道散射 &#xff08;3&#xff09; 信道时变性 一. 信息论模型 194…...

React 实现拖放功能

介绍 本篇文章将会使用react实现简单拖放功能。 样例 布局侧边栏拖放 LayoutResize.js import React, {useState} from "react"; import { Button } from "antd"; import "./LayoutResize.css";export const LayoutResize () > {const […...

马克思主义基本原理笔记

马克思主义哲学、政治经济学、科学社会主义理论 哲学 马克思主义中国化的理论成果&#xff1a;毛泽东思想、邓小平理论、三个代表重要思想、科学发展观 物质和意识哪个是本原&#xff0c;是哲学的基本问题 辩证法认为世界上的事物都是相互联系的、运动发展的&#xff0c;形…...

Vue+JavaSpingBoot笔记(1)

一、前后端通信参数问题 1.集合【字典】类型 Vue前端传递参数: export default {methods: { test(){// 将 filteredData 中的每一行值放入 newData 对象数组中 const newData filteredData.map(item > ({key1: item.Value1,key2: item.Value2,key3: "测试"}));r…...

10-单例模式(Singleton)

意图 保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点 实现 1 懒汉式&#xff0c;线程不安全 public class Singleton { private static Singleton instance; private Singleton (){} public static Singleton getInstance() { if (instance null) {…...

C++ 求一个数是否是丑数。

#include<string.h> #include <iostream> using namespace std; int isChou(int num) { if (num < 0) { return 0; } while (num % 2 0) { // 不断除以2&#xff0c;直到不能整除为止 num / 2; } while (num % 3 0) { // 不断除…...

SpringCloud系列篇:核心组件之注册中心组件

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.注册中心组件是什么 二.注册中心…...

通过IP地址防范钓鱼网站诈骗的有效措施

随着互联网的普及&#xff0c;钓鱼网站诈骗成为一种广泛存在的网络犯罪行为。通过冒充合法网站&#xff0c;攻击者试图窃取用户的敏感信息。本文将探讨如何通过IP地址防范钓鱼网站诈骗&#xff0c;提供一系列有效的措施&#xff0c;以加强网络安全&#xff0c;保护用户免受诈骗…...

服务器GPU温度过高挂掉排查记录

服务器GPU挂掉 跑深度学习的代码的时候发现中断了。通过命令查看&#xff1a; nvidia-smi显示 Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。感觉很莫名其妙。通过重启大法之后&#xff0c;又能用一段时间。 shutdown -r now但是过了一个小…...

服务器终端快速下载coco数据集

######解压到当前文件夹 sudo apt-get install aria2 aria2c -c <url> #<url>即为官网下载地址# url # download images http://images.cocodataset.org/zips/train2017.zip http://images.cocodataset.org/zips/val2017.zip# download annotations http://i…...

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…...

MySQL基础篇(一)SQL

视频地址: 黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括 SQL&#xff0c;全称 Structured Query Language&#xff0c;结构化查询语言。操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库统一 标准。 一、SQL通用语…...

多类指针式仪表自动读数系统的LabVIEW开发应用案例

多类指针式仪表自动读数系统的LabVIEW开发应用案例 工业环境中&#xff0c;多类指针式仪表的自动读数一直是一个具有挑战性的问题。本案例旨在展示如何使用LabVIEW开发一个高度智能化的多类指针式仪表自动读数系统&#xff0c;以应对复杂的工业环境。通过结合图像处理技术和深…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...