第一章 初始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 ...
随机推荐
- ArrayList和LinkedList、及Vector对比分析
ArrayList和LinkedList 底层结构 两者的差别主要来自于底层的数据结构不同,ArrayList是基于数组实现的,LinkedList是基于双链表实现的. 接口实现 LinkedList ...
- AOP的简单介绍
1.AOP简介 AOP面向切面编程,采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视.安全检查.缓存) SpringAOP使用纯java实现,不需要专门的编译过程和类加载器,在运行期间以代 ...
- Java(44)JDK新特性之函数式接口
作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201667.html 博客主页:https://www.cnblogs.com/testero ...
- 2021-2022 20211420 《信息安全专业导论》安装Linux操作系统并学习Linux基础
作业信息 |作业属于|https://edu.cnblogs.com/campus/besti/2021-2022-1fois |作业要求|https://edu.cnblogs.com/campus ...
- 【Java虚拟机5】Java内存模型(硬件层面的并发优化基础知识--指令乱序问题)
前言 其实之前大家都了解过volatile,它的第一个作用是保证内存可见,第二个作用是禁止指令重排序.今天系统学习下为什么CPU会指令重排. 存储器的层次结构图 1.CPU乱序执行指令的根源 CPU读 ...
- Golang通脉之反射
什么是反射 官方关于反射定义: Reflection in computing is the ability of a program to examine its own structure, pa ...
- Beta_Scrum Meeting_0
日期:2021年5月26日 参会人员:cy.hcc.lsc.dxh 会议主题:为Beta阶段最早两日的开发制定目标 一.进度情况 组员 负责 两日内完成的任务 接下来两日预计完成的任务 hcc 前端 ...
- 2021.8.24考试总结[NOIP47]
T1 prime 发现只需筛小于等于$mid(\sqrt r,k)$的质数,之后用这些质数筛掉区间内不合法的数即可. $code:$ 1 #include<bits/stdc++.h> 2 ...
- 【linux】修改ip后hadoop只有四个节点的问题
学校的机房,每重启一次就会将虚拟机的某些配置还原到部署到学生机时候的状态(例如.etc/hosts文件中ip与主机名的映射),这个时候与我们前面所部署的hadoop就会产生IP不对应的状态,导致了ha ...
- matlab 图像保存时去除白边
很是讨厌MATLAB输出图像时自带的白边,尤其是当导出.eps格式时,很难通过编辑图片来去掉白边.网上有很多代码但是没有注释,有很多坑要填.这里提供一个去除白边的代码,自己在别人的基础上修改了而且加了 ...