第一章 初始C语言
第一章 初始C语言
1. C语言起源
1969年至1973年间,为了移植与开发UNIX操作系统,由丹尼斯·里奇与肯·汤普逊,以B语言为基础,在贝尔实验室设计、开发出来。
C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐,成为使用最为广泛的编程语言。目前,C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。
二十世纪八十年代,为了避免各开发厂商用的C语言的语法产生差异,由美国国家标准局为C语言订定了一套完整的国际标准语法,称为ANSI C,作为C语言的标准。二十世纪八十年代至今的有关程序开发工具,一般都支持符合ANSI C的语法。
2. 选择C语言的理由
2.1 设计特性
C语言的设计理念让用户能轻松完成自顶向下的规划、结构化编程和模块化设计。因此,用C语言编写的程序更易懂、更可靠。
2.2 高效性
C语言具有通常是汇编语言才具有的微调控制能力,可以根据具体情况微调程序以获得最大运行速度或最有效地使用内存。
2.3 可移植性
C语言是移植语言。在一种系统中编写的C程序稍作修改或不修改就能在其他系统运行。
2.4 强大而灵活
C语言功能强大且灵活,如UNIX操作系统是用C语言写的。其他的一些语言(FORTRAN、perl、Python、Pascal、BASIC)的编译器和解释器都是C语言编写。
2.5 面向程序员
C语言是为了满足程序员的需求而设计的,程序员利用C可以访问硬件、操作内在中的位。C语言有丰富的运算符,能让程序员简洁表达自己的意图。
3. C语言的应用范围
早在20世纪80年代,C语言就有已经成为小型计算机使用的主流语言。从那以后C语言的应用范围扩展到微型机和大型机。C语言是嵌入式系统编程的流行语言,还能从科学编程领域分一杯羹,而且作为开发操作系统的主流语言C在Linux开发中扮演着极其重要的角色。
4.计算机能做什么
中央处理单元(CPU)承担绝大部分的运算工作。随机存取内存(RAM)是存储程序和文件的工作区。而永久内存存储设备(硬盘:机械硬盘和固态硬盘)在关闭计算机后也不会丢失之前存储的程序和文件。还有各种外围设备(键盘、鼠标、触摸屏、显示器)提供人与计算机之间的交互。
5. C语言标准
C语言发展之初,并没有所谓的C标准。1978年布莱恩·柯林汉和丹尼斯·里奇合著的(《C语言程序设计》)第1版是公认的C标准。
5.1 第1个ANSI/ISO C标准
1983年美国国家标准协会(ANSI)组建了一个委员会(X3J11),开发了一套新标准,并于1989年正式公布。该标准(ANSI C)定义了C语言和C标准库。国际标准化组织于1990年采用了这套标准(ISO C).ISO C 和 ANSI C是完全相同的标准。ANSI/ISO 标准的最终版本通常叫C89.
C精神:
- 信任程序员;
- 不要妨碍程序员做需要做的事;
- 保持语言精练简单;
- 只提供一种方法执行一项操作;
- 让程序运行更快,即使不能保证其可移植性。
在1990年,ANSI C标准(带有一些小改动)被国际标准化组织采纳为ISO/IEC 9899:1990,这个版本有时候称为C90。因此,C89和C90通常指同一种语言。
5.2 C99标准
1994年 ANSI/ISO联合委员会(C9X委员会)开始修订C标准,最终发布了C99标准。委员会的用意不是在C语言中添加新特性,而是为了达到新的目标
- 第一个目标是支持国际化编程
- 第二个目标是调整现有实践致力于解决明显的缺陷
- 第三个目标是为适应科学和工程项目中的关键数值计算,提高C的适应性。
5.3 C11标准
标准委员会在2007年承诺C标准的下一个版本是C1X,2011年终于发布了C11标准。此次委员会提出了一些新的指导原则,不在那么强调"信任程序员"目标了。而且C99中的一些特性成为C11的可选项了。
5.4 C18 标准
C18 (也被称为为C17)是于2018年6月发布的ISO/IEC 9899:2018的非正式名称, 也是截止到2020年6月为止最新的C语言编程标准。 它被用来替代C11标准(即ISO/IEC 9899:2011),C18没有引入新的语言特性,只对C11进行了补充和修正。它是C语言的现行标准。
C18标准即将被C2x标准所取代,C2x引入了一些新特性。目前可以确定的是,C2x标准将加入符合IEEE标准的十进制浮点数,这使得计算机能够精确地储存浮点数。
7. 使用C语言的7个步骤
定义程序的目标
明确想做什么
设计程序
如何组织程序,目标用户是谁,花多长时间完成这个程序,程序中如何表示数据,怎么处理数据?
编写程序
编译
运行程序
测试和调试程序
维护和修改代码
8. 编程机制
用C语言编写程序时,编写的内容被储存在文本文件中,该文件被称为源代码文件(source code file),大部分C系统,都要求文件名以.c结尾。在文件名中,点号(.)前面的部分称为基名(basename),点号后面的部分称为扩展名(extension).
cat concrete.c
#include <stdio.h>
int main(void)
{
printf("Concrete contains gravel and cement.\n");
return 0;
}
8.1 目标代码文件、可执行文件和库
把源代码文件转换成可执行文件,编译器把源代码转换成中间代码,链接器把中间代码和其他代码合并,生成可执行文件。C使用这种分而治之的方法方便对程序进行模块化,可以独立编译单独的模块,稍后再用链接器合并已经编译的模块。
中间代码文件有多种形式,在这里主要指把源代码转换为机器语言代码,并把结果放在目标代码文件中。这时目标代码文件还缺失启动代码(startup code)启动代码充当着程序和操作系统之间的接口。除启动代码外还缺少库函数,几乎所有的C程序都要使用C标准库中的函数,目标代码文件并不包含该函数的代码。链接器的作用就是把目标代码、系统的标准启动代码和库代码这3部分合并成一个文件。即可执行文件。
目标文件和可执行文件都由机器语言指令组成的。目标文件中只包含编译器为你编写的代码翻译的机器语言代码,可执行文件中还包含编写的程序中使用的库函数和启动代码的机器代码。
8.2 GNU编译器集合和LLVM项目
GNU项目始于1987年,是一个开发大量免费UNIX软件的集合。GNU编译器也被称为GCC,是该项目的产品之一。
LLVM始于伊利诺伊大学的2000份研究项目。它的Clang编译器处理C代码。2021年Clang成为FreeBSD的默认C编译器。
查看GCC版本:
gcc -v
编译时使用不同的C标准
gcc -std=c99 inform.c #调用C99标准
gcc -std=c1x inform.c #调用GCC接受C11之前的草案标准
gcc -std=c11 inform.c #调用GCC接受的C11标准
第一章 初始C语言的更多相关文章
- Java 学习笔记 第一章:Java语言开发环境搭建
第一章:Java语言开发环境搭建 第二章:常量.变量和数据类型 第三章:数据类型转换.运算符和方法入门 1.Java虚拟机——JVM JVM(Java Virtual Machine ):Java虚拟 ...
- 第一章:Javascript语言核心
本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...
- 第一章: 初始JVM
跟很多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试. 因为装逼 但我经过了几年的学习和实战,我发现其实 ...
- 《自学C语言》第一章:C语言简介
这一章主要介绍什么是C语言,以及它的产生.发展历史.如其中所说的计算机术语有不懂的请百度,例如什么是强类型,什么是高级语言. 1.C语言是什么? 答:C语言是一门通用计算机编程语言,应用广泛.C语言的 ...
- 第一章 Python程序语言简介
第一节 Python概述 1. 什么是Python Python是一种 解释型.面向对象.动态数据类型 的高级程序设计语言.由Guido van Rossum与1989年发明,第一个公开发行版本发行于 ...
- 《大道至简》第一章读后感--JAVA语言伪代码形式
import.java.大道至简.*; //一·愚公移山 import.java.愚公移山.*; public class YuGongYiShan { //原始需求:惩山北之塞,出入之迂 //项目沟 ...
- 第一章:java语言概述与开发环境
前言: 1.程序是什么? 程序是对现实世界的数字化模拟! 2.编程语言是工具,程序的作用就是解决问题! 重要的思路! 该知识点能解决什么问题? 1.语言特性:单继承.多接口! 纯面向 ...
- 【疯狂Java学习笔记】【第一章:Java语言概述】
[学习笔记]1.Java与C#的异同:Java与C#的相同之处有很多,它们均摒弃了C++面向对象的多继承.宏定义.全局变量.全局函数.指针等等难以使用的机制,添加进了成熟的机制,如垃圾回收.接口等等. ...
- 第一章:Java语言概述与环境开发
1.计算机高级语言按程序的执行方式可以分为编译型和解释型两种: 2.JAVA程序的执行过程必须经过先编译后解释两个步骤: 3.JAVA语言里负责执行字节码文件的是JAVA虚拟机 (Java Virtu ...
随机推荐
- 遇到括号就是栈(bushi)
CF508E Arthur and Brackets 我在赛场上想都没想直接DP \(O(n^3)\)过了 但别人说正解是栈+贪心 讲讲DP \(bool\) \(dp[i][j]\)表示从第i对括号 ...
- logstash输出到rabbitmq
场景 将应用日志文件发送到rabbitmq. filebeat 不支持rabbitmq作为输出.因此,需要先将文件由filebeat发送到logstash ,再由logstash 输出到rabbitm ...
- 题解 AVL 树
link Description 给出一个 \(n\) 个点的 AVL 树,求保留 \(k\) 个点使得字典序最小. \(n\le 5\times 10^5\) Solution 因为我很 sb ,所 ...
- 题解 [HAOI2012]道路
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条边的有向图,问每一条边在多少个最短路径中出现. \(n\le 1500,m\le 5000\) 思路 算我孤陋寡闻了... 很显然,我们 ...
- 舌头算法的C++实现
观察生活,我们不难发现,吃饭的时候,有时候左边的东西会到右边来,这是为什么呢?就是舌头的作用了. 下面的代码将模拟舌头的运动: #include <iostream> #include & ...
- python 类方法 静态方法
属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法:(按作用) 构造方法 析构函数 方法: ...
- 数字IC设计工程师的知识结构
刚毕业的时候,我年少轻狂,以为自己已经可以独当一面,庙堂之上所学已经足以应付业界需要.然而在后来的工作过程中,我认识了很多牛人,也从他们身上学到了很多,从中总结了一个IC设计工程师需要具备的知识架构, ...
- VUE中v-for更新检测
口诀: 数组变更方法,就会导致 v-for 更新,页面更新 数组非变更方法:返回新数组,就不会导致 v-for 更新,更新值检测不到可采用覆盖或者 this.$set() 数组变更方法如下: 1. a ...
- js_数据类型转换
转整数----parseInt(string,radix) 1)类似于从左往右匹配数字,直到匹配到非数字结束,并返回匹配到的数字.同parseFloat(). parseInt("123&q ...
- 主仆见证了 Hobo 的离别 题解
前言: 题面挺神仙.反正我考试的时候看了40分钟也没看懂. 后来改题感觉自己写的挺假,没想到加个\(k==1\)的特判竟然就A了?无语力. 解析: 看懂题以后就好说了.首先这显然是一个树形结构.我们考 ...