C语言目录:
很多高级语言都是从C语言衍生的
- C++、C#、Object-C、Java、Go等
很多系统软件都是由C语言编写的
- 几乎所有的操作系统都是C编写的
- 几乎所有的计算机底层应用软件都是C编写的
- 几乎所有的编辑器都是C编写的
1.1 C语言发展史
F O R T R A N → A L G O L → C P L → B C P L → B → C → C + + FORTRAN\rightarrow ALGOL\rightarrow CPL \rightarrow BCPL\rightarrow B\rightarrow C\rightarrow C++ FORTRAN→ALGOL→CPL→BCPL→B→C→C++
BCPL与B语言:精炼、接近硬件,但过于简单,无数据类型
- 1970 年美国贝尔实验室 Ken Tompson 以BCPL为基础,设计出了很简单而且很接近硬件的B语言,并用B语言写出了第一个UNIX操作系统。但B语言过于简单,功能有限
- 1972 年至1973 年期间,贝尔实验室 Dennis Ritchie 在B语言的基础上设计出了C语言。C语言保持B语言的精炼与接近硬件的特性,又克服了他们的缺点
1.2 C语言标准
- 1989年C语言标准被批准,这个版本的C语言标准通常被称为ANSI C(C89)
- 1999年,国际标准化组织ISO又对C语言标准进行修订,在基本保留原C语言特征的基础上,针对应该的需要,增加了一些功能,命名为C99
- 2011年12月,ANSI采纳了ISO/IEC 9899:2011标准。这个标准通常即C11,它是C程序语言的现行标准
1.3 优点
-
简洁性:核心内容少,只有 32 个关键字,9 种控制语句、44 种运算符
条件语句:if…else,switch
循环语句:while,for,do…while
break,continue,return,goto -
丰富的数据类型
-
具有低级语言的特点:与汇编语相近的功能和描述方法,如地址运算和二进制数位
可以对硬件端口进行直接操作
-
结构化语言,适用于大型程序模块化设计
-
代码效率高
-
语法限制不严,程序设计自由度大
-
可移植性好
1.4 算法
通过有限步骤,明确的操作产生问题答案
算法表示
自然语言,传统流程图,N-S流程图,伪代码
常用算法:枚举,递推,递归
1.5 数据在计算机中的表示
1.5.1 进制转换
进制
计数的方式,数值的表示方式
十进制 0、1、2、3、4、5、6、7、8、9 逢十进一
二进制 0、1 逢二进一
- 书写格式:
0b
101
八进制 0、1、2、3、4、5、6、7 逢八进一
- 书写格式:
0
61
十六进制 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F 逢十六进一
- 书写格式:
0x
45
转二进制
整数部分:除基取余,从下至上
小数部分:乘积取整,从上至下
1.5.2 数据编码
计算机只能识别0和1的形式存储的
数据在计算机内部是以 补码 的形式存储,所有的运算都是以补码存储
-
正数的原码、反码和补码都是它的二进制
-
负数的原码, 是将该负数的二进制最高位变为1
负数的反码, 是将该数的原码 除了符号位 以外的 其它位取反
负数的补码, 就是它的反码 + 1
码制的由来
原码的减法不正确,所以引入反码。但反码相同的数相减,得到 -0。但前面的符号没有任何意义,所以引入补码。
1.6 C语言程序组成
一个C语言程序由多个函数组成,每个函数有自己的功能
一个程序有且仅有一个主函数
-
如果一个程序没有主函数,则这个函数不具备运行能力
-
程序运行时系统会自动调用主函数,而其他函数需要开发手动调用
1.6.1 主函数
a. 写法
int main(){
//other code...
return 0;
}
-
主函数前的int可以不写或者换成
void
-
main函数中的 return 0 可以不写
多种写法产生原因
-
C语言最早的时候只是一种规范和标准(如C89,C11)
-
标准的推行需要各大厂商的支持和实施,由于各大厂商的各自实施,导致实施的标准不同
b. 执行结果
如果main函数的执行正常, 那么就返回0
main()
默认返回0,可以不写如果main函数执行不正常, 那么就返回一个非0的数
c. 主函数参数
main(int argc,const char * argv[])
参数列表含义
int argc
系统在启动程序时传递给argv
的值的个数const char* argv[]
系统在启动程序时传入的值,默认情况下只会传入一个值——main()
函数执行文件的路径
可以通过 命令行 或者 项目设置 给 main()
传入其他参数
# include<stdio.h>
main(int argc,char* argv[]){
printf("argc = %d\n",argc);
printf("argv[0]=%s\n",argv[0]);
printf("argv[1]=%s\n",argv[1]);
getchar();
}
1.6.2 注释
注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流沟通
a. 注释分类
单行注释
// 被注释内容
-
使用范围:任何地方
-
作用范围: 从第二个斜线到这一行末尾
-
快捷键:Ctrl+/
多行注释
/* 被注释内容 \*/
-
使用范围:任何地方
-
作用范围: 从第一个
/*
到最近的一个*/
c. 注意
单行注释可以嵌套单行注释、多行注释
// aa // vvvvvv
// /* asdasd */
多行注释可以嵌套单行注释
/*
// asdasd
*/
多行注释 不能 嵌套多行注释
/*
哈哈哈
/*嘻嘻嘻*/
呵呵呵
*/
1.6.3 关键字
C语言中具有特殊含义的单词
a. 特点
-
全部小写
-
不可用作变量名、函数名等
-
C语言一共有32个关键字
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|
char | short | int | long | float | double | if | else |
return | do | while | for | switch | case | break | continue |
default | goto | sizeof | auto | register | static | extern | unsigned |
signed | typedef | struct | enum | union | void | const | volatile |
b. 分类
基本数据类型关键字
char
:字符类型变量
int
:整型变量
float
:浮点类型变量(单精度)
double
:浮点类型变量(双精度)
enum
:枚举声明
类型修饰符
short
:修饰 int
,表示短整型
long
:修饰 int
,表示长整型
signed
:修饰 int
,声明为有符号数据类型
unsigned
:修饰 int
,声明为无符号整数类型
结构类型关键字
struct
:结构体声明
union
:共用体声明
流程控制关键字
分支结构
if
:条件语句
else
:条件语句的否定分支
switch
:开关语句
case
:开关语句的分支标记
default
:开关语句中的其他分支
循环语句
for
:循环语句
while
:循环语句
do...while
:循环语句
跳转语句
continue
:跳过语句
break
:跳出语句
goto
:无条件跳转
return
:返回语句,用于返回特定值
存储类型关键字
auto
:指定为自动变量
register
:指定为寄存器变量
static
:指定为静态存储类型
extern
:指定对应变量为外部存储类型
const
:指定变量为只读变量
volatile
:指定变量为易变变量
特殊用途关键字
sizeof
:计算数据长度
typeof
:声明类型别名
void
:空类型