第一章 初始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 ...
随机推荐
- HttpClient使用GET方式通过代理服务器读取页面的例子
import java.io.BufferedReader;import java.io.InputStreamReader;import org.apache.http.HttpEntity;imp ...
- java调用js脚本语言
在我们开发的过程中,可能有这么一种情况,在java中需要取调用js方法完成一些事情.那么什么时候可能出现这种情况呢.比如我们使用爬虫模拟登录别的网站,但有些网站前台使用js对密码进行了加密处理,那么就 ...
- Noip模拟20 2021.7.19
T1 玩具 题目读错意思直接报零... 拼接方式没读懂以为是个数学题,用卡特兰数,可是的确想多了 数据范围表达出你怎么暴力都行,选择$n^3,dp$ 相当于一片森林,每次多加一条边就合并成一棵树 在$ ...
- Python环境配置详细步骤以及第一个程序
打开python官网:https://www.python.org/ 在官网找与自己电脑系统匹配的版本路径 这里以python3.7.2版本为例: 下载完成后,使用管理员身份进行安装: 打开命令提 ...
- Python中的括号()、[]、{}
长时间不用容易混淆,仅记! 在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{} . Python中的小括号(): 代表tuple元祖数据类型,元祖是一种不可变序列.大多 ...
- 21.10.12 test
题目 **WOJ5110 ** 到 WOJ5113 校内自测没开捆绑,于是输出 -1 和 n! 的程序拿到了高分,我的得分也比期望得分略有提升 T1 problem a \(\color{red}{2 ...
- hdu 3199 Hamming Problem(构造?枚举?)
题意: For each three prime numbers p1, p2 and p3, let's define Hamming sequence Hi(p1, p2, p3), i=1, . ...
- Dataworks批量刷数优化方案探讨
Dataworks批量刷数优化方案探讨 在数据仓库的日常使用中,经常会有批量补数据,或者逻辑调整后批量重跑数据的场景. 批量刷数的实现方式,因调度工具差异而各有不同. Dataworks调度批量刷数局 ...
- Redis源码分析(intset)
源码版本:4.0.1 源码位置: intset.h:数据结构的定义 intset.c:创建.增删等操作实现 1. 整数集合简介 intset是Redis内存数据结构之一,和之前的 sds. skipl ...
- Qt Creator 常用快捷键 详细总结
下面是我总结的一些Qt Creator 常用快捷键 ,可以大大提高我们使用Qt开发项目的效率!! Qt Creator 常用快捷键 快捷键 介绍 F1 查看帮助文档 Shift + F2 函数的声明和 ...