第一章 初始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 ...
随机推荐
- 快速入门maven
1.快速介绍 maven(翻译:专家,内行)是apache(一个公司/组织)做的一个项目,或者说是软件,这个东西可以干什么? 可以用它来对咱们做的项目进行改进,增加开发效率,比如帮助你自动导入jar包 ...
- Java泛型背后是什么?
文Java中泛型的应用,让大家更好地理解泛型,以及常说的泛型类型擦除是什么概念,举一个简单的例子,如下: 这里可以看出来在代码编写阶段就已经报错了,不能往string类型的集合中添加int类型的数据. ...
- Python绘制Excel图表
今天讲解下如何使用Python绘制各种Excel图表,下面我们以绘制饼状图.柱状图.水平图.气泡图.2D面积图.3D面积图为例来说明. import openpyxlfrom openpyxl imp ...
- SCons - 简单而强大的项目编译脚本(原文https://www.cnblogs.com/binchen-china/p/5646791.html)
N年前学的makefile,当时还勉强能写一些简单的工程编译,现在已经基本忘了.makefile确实编写复杂,而且平时也不是经常使用,容易忘记.偶识了scons,一切都变的简单了.最近研究了下scon ...
- 如何用PADS进行PCB设计?这6步就够了
在使用PADS进行PCB设计的过程中,需要对印制板的设计流程以及相关的注意事项进行重点关注,这样才能更好的为工作组中的设计人员提供系统的设计规范,同时也方便设计人员之间进行相互的交流和检查. 02 设 ...
- 攻防世界 杂项 12.Training-Stegano-1
题目描述: 这是我能想到的最基础的图片隐写术.啊这 题目分析: 最初还以为直接右击属性查看呢 然后用notepad++看看,一团乱码,结果在最后发现了passwd, 然后这就是flag:stegano ...
- AVL树的插入和删除
一.AVL 树 在计算机科学中,AVL树是最早被发明的自平衡二叉查找树.在AVL树中,任一节点对应的两棵子树的最大高度差为 1,因此它也被称为高度平衡树.查找.插入和删除在平均和最坏情况下的时间复杂度 ...
- palindrome-partitioning-ii leetcode C++
Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...
- cf18B Platforms(仔细谨慎题)
题意: In one one-dimensional world there are n platforms. Platform with index k (platforms are numbere ...
- linux 启动过程以及如何将进程加入开机自启
linux 启动流程 系统启动主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确定运行级别 4. 加载开机启动程序 5. 用户登录 启动流程的具体细节可以看看Linux 的启动流程 第4步 ...