Skip to content

程序的概念

​ 程序告诉计算机应如何完成一个计算任务,这里的计算可以是数学运算,比如解方程,也可以是符号运算,比如查找和替换文档中的某个单词。

​ 从根本上说,计算机是由数字电路组成的运算机器,只能对数字做运算,程序之所以能做符号运算,是因为符号在计算机内部也是用数字表示的。

​ 此外,程序还可以处理声音和图像,声音和图像在计算机内部必然也是用数字表示的,这些数字经过专门的硬件设备转换成人可以听到、看到的声音和图像。 程序由一系列基本操作组成,基本操作有以下几类:

输入(Input):从键盘、文件或者其他设备获取数据。

输出(Output):把数据显示到屏幕,或者存入一个文件,或者发送到其他设备。

基本运算:最基本的数据访问和数学运算(加减乘除)。

测试和分支:测试某个条件,然后根据不同的测试结果执行不同的后续操作。

循环:重复执行一系列操作。

​ 你曾用过的任何一个程序,不管它有多么复杂,都是按这几类基本操作一步一步执行的。

​ 程序是那么的复杂,而编写程序可以用的基本操作却只有这么简单的几种,这中间巨大的落差就要由程序员去填补了,所以编写程序理应是一件相当复杂的工作。

编写程序可以说是这样一个过程:把复杂的任务分解成子任务,把子任务再分解成更简单的任务,层层分解,直到最后简单得可以用以上几种基本操作来完成。

编程语言

低级语言如:

机器语言,汇编语言

属于低级语言,直接用计算机指令编写程序。

高级语言如:

C、C++、Java、Python等属于高级语言,用语句编写程序,语句是计算机指令的抽象表示。

举个例子,同样一个语句用机器语言、汇编语言和C语言分别表示如下: 一个语句的三种表示

编程语言 表示形式

机器语言 a1 18 a0 04 0883 c0 01a3 1c a0 04 08

汇编语言 mov 0x804a018,%eaxadd $0x1,%eaxmov %eax,0x804a01c

C语言 a = b + 1;

流程图

我们可以用一条公式来表示程序流程图,即:

程序流程图=程序流程+图

简单来说,就是一种描述程序流向的图形。一般由处理框、判断框、起止框、连接点、流程线、注释框等元素构成。

程序流程图的基本结构

**顺序型:**几个连续的处理步骤依次排列构成

**选择型:**由某个逻辑判断式的取值决定选择两个处理中的一个

**判定型循环:**在循环控制条件成立时,重复执行特定的处理

c语言特点

1、简洁紧凑、灵活方便

C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。

C语言的关键字关键字的作用
auto声明自动变量,一般不使用,因为变量默认就是自动类型
break跳出当前循环
case开关语句分支,一般与switch搭配使用
char声明字符型变量或函数
const声明只读变量
continue结束当前循环,开始下一轮循环,不执行continue后面的语句调到循环条件判断处重新判断是否开始下一次循环
default开关语句中的“其他”分支
do循环语句的循环体,do-while循环,至少执行一次
double声明双精度变量或函数
else条件语句否定分支(可与if连用)
enum声明枚举类型,32位下一个枚举类型大小为4个字节
extern声明变量是在其他文件正声明,可以改变变量的链接属性
float声明单精度浮点型变量或函数
for循环当中的一种语句
goto无条件跳语句
int声明整型变量或函数
if条件语句,常与else连用
long声明长整型变量或函数
register声明寄存器变量,编译器可忽略该请求
return子程序返回语句(可以带参数,也可以不带参数)
short声明短整型变量或函数
signed生命有符号类型变量或函数
sizeof计算数据类型长度
static声明静态变量,可用于改变变量的链接属性,但只适用于默认属性为external的变量
struct声明结构体变量或函数
switch用于开关语句,常与case语句连用
typedef用以给数据类型取别名(当然还有其他作用)
union声明联合数据类型,联合体成员共用同一块内存,联合体大小为最大成员所占内存大小
unsigned声明无符号类型变量或函数
void声明函数无返回值或无参数,声明无类型指针
volatile说明变量在程序执行中可被隐含地改变
while循环语句的循环条件

2、运算符丰富

C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。 从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

3、数据结构丰富

C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。 另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。

4、C是结构式语言

结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。 C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

5、C语法限制不太严格、程序设计自由度大

一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。而C语言允许程序编写者有较大的自由度。

6、C语言允许直接访问物理地址,可以直接对硬件进行操作

因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。

7、C语言程序生成代码质量高,程序执行效率高

一般只比汇编程序生成的目标代码效率低10へ20%。

8、 C语言适用范围大,可移植性好

C语言有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。

c语言程序解析与执行过程

组成

#include

叫做文件包含命令,用来引入对应的头文件(.h文件)。#include 也是C语言预处理命令的一种

c
int main(){
    return 0;
}

main()函数称之为主函数,一个C程序总是从main()函数开始执行的。

int指明了main()函数的返回类型

暂停黑窗口(原理:即让操作系统来暂停该程序进程的执行)

system("pause")

编译一个C语言程序是一个多阶段的过程。从总体上看,这个过程可以分成四个独立的阶段。预处理、编译、汇编和连接。

c
#include<stdio.h>
int main(){
    printf("Hello world\n");
    return 0;
}
gcc:编译器套件,编程语言编译器

1.预处理(预处理文件.i)

编译的第一个阶段称为预处理。在这个阶段,以#字符开头的行被预处理器解释为预处理器命令。这些命令形成一种简单的宏语言,有自己的语法和语义。这种语言通过提供内联文件、定义宏和有条件地省略代码的功能,来减少源代码的重复性。

在解释命令之前,预处理器会做一些初始处理。这包括连接续行和剥离注释。

要打印预处理阶段的结果,请向gcc传递-E选项。

gcc -E helloworld.c -o helloworld.i

考虑到上面的 "Hello, World!"的例子,预处理器将产生stdio.h头文件的内容和helloworld.c文件的内容,并将其前面的注释剥离出来。

2.编译(生成汇编指令文件.s)

编译的第二个阶段被称为编译,令人困惑。在这个阶段,预处理过的代码被翻译成目标处理器架构特有的汇编指令。这些形成了一种中间的人类可读语言。

这一步骤的存在允许C代码包含内联汇编指令,并允许使用不同的汇编器。

一些编译器也支持使用集成汇编器,在这种情况下,编译阶段直接生成机器代码,避免了生成中间汇编指令和调用汇编器的开销。

要保存编译阶段的结果,可以向gcc传递-S选项。

gcc -S helloworld.c

这将创建一个名为helloworld.s的文件,包含生成的汇编指令。

3.汇编(二进制文件.o)

在这个阶段,汇编器被用来将汇编指令翻译成目标代码。输出包括目标处理器要运行的实际指令。

要保存汇编阶段的结果,请向gcc传递-c选项。

gcc -c helloworld.c 运行上述命令将创建一个名为helloworld.o的文件,包含程序的目标代码。这个文件的内容是二进制格式。

4.链接(可执行文件.exe)

汇编阶段产生的目标代码是由处理器能够理解的机器指令组成的,但程序的某些部分是不符合顺序的或缺失的。为了产生一个可执行的程序,现有的部分必须被重新排列,并把缺失的部分补上。这个过程被称为链接。

链接器将安排目标代码的各个部分,使某些部分的功能能够成功地调用其他部分的功能。它还将添加包含程序所使用的库函数指令的片段。

这一阶段的结果是最终的可执行程序。

gcc -o helloworld helloworld.c

Released under 鸢のhomepage