程序的概念
程序告诉计算机应如何完成一个计算任务,这里的计算可以是数学运算,比如解方程,也可以是符号运算,比如查找和替换文档中的某个单词。
从根本上说,计算机是由数字电路组成的运算机器,只能对数字做运算,程序之所以能做符号运算,是因为符号在计算机内部也是用数字表示的。
此外,程序还可以处理声音和图像,声音和图像在计算机内部必然也是用数字表示的,这些数字经过专门的硬件设备转换成人可以听到、看到的声音和图像。 程序由一系列基本操作组成,基本操作有以下几类:
输入(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语言预处理命令的一种
int main(){
return 0;
}
main()函数称之为主函数,一个C程序总是从main()函数开始执行的。
int指明了main()函数的返回类型
暂停黑窗口(原理:即让操作系统来暂停该程序进程的执行)
system("pause")
编译一个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