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还是“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(右)
到了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语言的基础上的
例如:
- 操作系统。C语言设计的初衷就是用来编写操作系统,目前所有的主流操作系统内核,所采用的编程语言都是C语言。
- 网络协议栈。一般和内核采用相同的语言实现,也就是C语言。
- Web服务器/HTTP服务器。Apache、Nginx主要由C语言编写。Tomcat(Java编写,仅运行Java应用)
- 关系型数据库。PostgreSQL、SQLite主要由C语言编写。MySQL(C/C++)
- 非关系型数据库。Redis主要由C语言编写。MongoDB(C++)、Elasticsearch(Java)
- …
C语言是一门接近"低级语言"的"中级语言"
所谓"中级"编程语言,是要比较的,参看下图:
图 4. C语言是"中级语言"
这意味着C语言有以下优点:
- **C语言是一门接近硬件层面的编程语言,提供了接近硬件的操作能力。**C语言通过提供直接内存访问、指针操作和系统调用等功能,允许程序员以接近硬件的方式编写代码。这种能力使得C语言特别适用于嵌入式系统开发以及系统级编程。
- C语言拥有在所有编程语言中几乎独一档的高运行效率。
- C语言提供了接近硬件的操作能力,这意味着C程序可以更好的利用硬件资源。
- C语言编译器将源代码直接编译成机器代码(或非常接近的汇编语言),而非解释执行或编译为中间代码。
- **C语言还提供了各种特性使得程序员可以控制优化C程序的几乎每一个细节。**比如C语言的手动内存分配控制,这意味着可以精确地管理资源使用,从而提高效率。
- 在平均一般情况下,如果一个C程序的执行速度是100%,那么:
- C++可能由于复杂性的影响,性能会轻微下降,一般是95%左右。
- Java由于JVM等特性的影响,运行效率一般低于C/C++,大概在50%-80%范围内。
- Python是一种脚本语言,需要解释执行,效率很差。可能在5%-30%之间。
- **C语言的语法非常简洁,没有太多复杂的特性。**作为一门接近硬件的编程语言,C语言的抽象层次很低,没有很多高级的抽象特性。这使得C语言简单易学,同时对于想要深入理解计算机原理的人来说,C语言的低抽象性也可以使得学习者可以更好的忽略语言特性,关注具体原理。
- C语言作为一门"中级语言",市面上流行的编程语言基本都可以找到它的影子(C-like语言),所以学习C语言对于学习其他编程语言也有很大的帮助。
C语言是一门从诞生到现在,一直都非常流行的编程语言
C语言的生命力旺盛,从诞生到如今始终都是最流行的开发语言之一。
可以参考:TIOBE世界编程语言排行榜
四、C语言的缺点
很多时候,一个优点往往同步带来一些缺点,C语言实际上是一门缺点很明显的编程语言。正如丹尼斯·里奇(Dennis M. Ritchie),C语言的主要发明者,曾经评价C语言说:
C is quirky, flawed, and an enormous success.
这句话直译为:“C语言是古怪的、有缺陷的,但同时取得了一个巨大的成功。”
C语言有以下突出的缺点:
- **C语言是一门非常容易出错,却非常不容易发现错误的编程语言。**这主要是因为:
- C语言的语法相对非常宽松和灵活,给予了程序员很大的自由度,但出错的概率也大大增加了。
- C语言给程序员很大的自主性和控制权限,但即便是熟练的C程序员也无法保证能够完美的控制程序。比如内存管理,手动的内存管理不仅增加了编程的复杂性,而且非常容易出错,如内存泄漏和使用未初始化的内存导致未定义行为。
- C语言追求效率,所以没有专门的异常机制来指示程序出现的问题。C程序甚至不会去检查数组下标越界的问题。
- …
- C语言缺少一些必要的高级特性,使得C程序的可维护性很差。一个复杂的C程序,如果在设计之初没有考虑到维护问题,那么将很难对它做出修改或扩展。(这也是C++出现的目的)
- 相比较现代的高级语言,C语言经常可以写出可读性十分差的代码。
- 这一方面是由于C语言作为一门小型语言,它缺乏一些现代高级语言中的特性,并且其标准库相对较小。因此,程序员往往需要自行编写复杂的代码实现,这些代码对于其他人可能难以理解。
- 另一方面,C语言诞生于编程发展的初期,那时的编程哲学倾向于代码的极致简洁性。这种风格有时会导致代码过于晦涩难懂,尤其是当程序员过分追求聪明的技巧时,可能会编写出只有自己能理解的代码。
- 在现代编程中,尤其是团队协作环境下,高度重视代码的可读性和维护性。因此,在我们的课堂上,我们会强调编写清晰易读的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单片机串行口相关知识 串行通信概念 计算机与外部通信方式就两种: 并行通信串行通信 两种通信方式的特点以及适用场景: 名称特点适用场景并行通信速度快,效率高,成本高适合短距离高速通信,如计算机内部各硬件之…...

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 二进制擦除信道 五. 小结 (1)信道直射与反射 (2)信道散射 (3) 信道时变性 一. 信息论模型 194…...

React 实现拖放功能
介绍 本篇文章将会使用react实现简单拖放功能。 样例 布局侧边栏拖放 LayoutResize.js import React, {useState} from "react"; import { Button } from "antd"; import "./LayoutResize.css";export const LayoutResize () > {const […...
马克思主义基本原理笔记
马克思主义哲学、政治经济学、科学社会主义理论 哲学 马克思主义中国化的理论成果:毛泽东思想、邓小平理论、三个代表重要思想、科学发展观 物质和意识哪个是本原,是哲学的基本问题 辩证法认为世界上的事物都是相互联系的、运动发展的,形…...
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)
意图 保证一个类只有一个实例,并提供一个访问它的全局访问点 实现 1 懒汉式,线程不安全 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,直到不能整除为止 num / 2; } while (num % 3 0) { // 不断除…...

SpringCloud系列篇:核心组件之注册中心组件
🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于SpringCloud的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一.注册中心组件是什么 二.注册中心…...

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

服务器GPU温度过高挂掉排查记录
服务器GPU挂掉 跑深度学习的代码的时候发现中断了。通过命令查看: nvidia-smi显示 Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。感觉很莫名其妙。通过重启大法之后,又能用一段时间。 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数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括 SQL,全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一 标准。 一、SQL通用语…...

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

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7
在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤: 第一步: 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为: // 改为 v…...
6.计算机网络核心知识点精要手册
计算机网络核心知识点精要手册 1.协议基础篇 网络协议三要素 语法:数据与控制信息的结构或格式,如同语言中的语法规则语义:控制信息的具体含义和响应方式,规定通信双方"说什么"同步:事件执行的顺序与时序…...
SpringCloud优势
目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...

WinUI3开发_使用mica效果
简介 Mica(云母)是Windows10/11上的一种现代化效果,是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果,Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...

分布式光纤声振传感技术原理与瑞利散射机制解析
分布式光纤传感技术(Distributed Fiber Optic Sensing,简称DFOS)作为近年来迅速发展的新型感知手段,已广泛应用于边界安防、油气管道监测、结构健康诊断、地震探测等领域。其子类技术——分布式光纤声振传感(Distribut…...