文章目录
- 助记提要
- 1章 C语言概述
- 2章 C语言基本概念
- 2.1 C程序的一般形式
- 2.2 C程序变为可执行文件的步骤
- 2.3 C程序注释
- 2.4 变量和赋值
- 变量类型
- 声明
- 赋值
- 初始化
- 显示值
- 2.5 读取输入
- 2.6 定义宏
- 2.7 标识符和关键字
- 标识符
- 不能作为标识符的关键字
- 2.8 C程序书写规范
助记提要
这些知识都是之前学过,所以助记提要只写自己模糊的部分。
- C语言最基本的3要素;
- float型赋值需要在末尾加后缀f的原因;
- C语言的关键字;
1章 C语言概述
- C语言的优点
- 高效。可以在有限的内存空间快速运行。
- 可移植。C语言编译器规模小且容易编写,C语言没有不兼容的多个分支。
- 功能强大。数据类型和运算符多。
- 灵活。既可以系统编程,也可以编写各种应用程序。
- 有标准库。涵盖了许多实用操作。
- 和UNIX集成。擅长结合UNIX系统。
- C语言的缺点
- 容易隐藏错误。C的灵活性导致它易出错,并且编译器无法检查到。
- 可能难以理解。C语言有其他通用语言没有的特性,本身就常常被误解。这些特性互相结合使用,有些结合方式难以理解。
- 难以修改。C语言没有类、包之类的特性,大规模的C程序必须提前考虑维护的问题。
- 高效使用C语言
- 学习和规避C语言的缺陷
- 使用调试工具发现错误
- 使用编码规范
- 要易于理解,避免过于简单或复杂的代码
- 尽量使用标准库,保证程序的移植性
2章 C语言基本概念
预处理指令、函数、变量、语句
2.1 C程序的一般形式
指令
int main(void)
{
语句
}
C程序必要的3个特性:指令、函数和语句。
-
指令
指令是指由预处理器执行的命令。所有的指令都是以字符#
开头的,默认只占一行,结尾没有分号或其他特殊标记。 -
函数
函数是一系列组合在一起的语句。函数有两类,一是用户自己编写的,二是由C语言编译器提供的,后者称为库函数。
C程序就是函数的集合。一个C程序可以包含多个函数,但是main
函数是必须有的,系统在执行程序时会自动调用main
函数。 -
语句
语句是程序运行时执行的命令。一个语句可以连续占用多行,有时很难确定结束位置。C语言使用分号作为语句的结尾。
2.2 C程序变为可执行文件的步骤
- 预处理。程序送给预处理器,预处理器执行以
#
开头指令。 - 编译。经过预处理后进入编译器,把程序翻译为机器指令(目标代码)。
- 链接。链接器把目标代码和所需的其他代码整合在一起,生成可执行程序。
2.3 C程序注释
注释可以在C程序的任何位置出现。可以单独占行,也能和其他命令出现在同一行中。
注释一般以/*
开始,以*/
结束。
单行注释的写法
/* 单行注释 */
// 单行注释
可执行的语句 // 注释
多行注释的写法
/* 第一行
第二行*/
// 第一行
// 第二行
/* 第一行 */
/* 第二行 */
为了让注释更易读:
/***************
* 注释 *
* 注释 *
***************/
/*
* 注释
*/
2.4 变量和赋值
变量是程序执行过程中临时存储数据的单元。
变量类型
类型用来说明变量存储的数据种类,每个变量都必须有类型。
类型影响变量的存储方式、变量能存储的值范围和允许对变量进行的操作。
最常用的两种类型:整型int
和浮点型float
。
int
类型用来存储取值范围有限的整数。
float
类型可以存储带小数位的数。
float
的算数运算比int
类型慢,并且float
类型存储的数值往往是是实数值的近似值,有时会出现误差。
声明
使用变量前必须对变量进行声明。
声明变量的语法是先指定变量的类型,然后说明变量的名字。
// 类型 变量名;
int height;
float area;
// 同类型的变量可以放到同一行声明,逗号隔开
int length, width;
float income, expend;
为了和旧版的C语言兼容,最好把函数中的变量声明都放在语句之前。
赋值
赋值,把值交给变量。使用等于号=
,将右侧的值赋值给左侧的变量。赋值语句也必须是分号结尾。
赋值之前必须先声明。赋值之后,就可以使用变量进行各种计算了。
// 对已声明的变量赋值
height = 8;
area = 25.6;
一般整型的值赋给int
型变量,浮点型的值赋给float
型变量。不这么做也可以,但是会不安全。
float
型的值在赋值时,最好在值后面加字母f
或F
。
area = 25.6f;
不加字母的f
的赋值仍然可以编译成功,但是可能会引起编译器的警告。
系统把数值存在常量缓冲区,默认用int存储整数,用double存储浮点数(double
是比float
型使用更大空间的浮点类型)。不加f
,系统会默认把带小数点的数值当成double
浮点数处理,然后再转换为float
类型,这样有可能导致精度丢失。
初始化
程序开始执行时,某些变量会被自动设置为0,有些则不会。
访问未初始化的值时,可能会得到不可预知的结果甚至导致程序崩溃。
可以在变量声明时加入初始值:
int height = 0;
int length = 0, width = 0;
显示值
C语言使用printf
函数显示变量的当前值。
printf
函数来自标准输入/输出库<stdio.h>
,需要通过#include
指令中引入。
#include <stdio.h>
int main(void) {
int height = 8;
float area = 25.6f;
// 显示整型值
printf("height: %d\n", height);
// 显示浮点型值
printf("area: %f\n", area);
// 显示表达式的值
printf("width: %f\n", area / height);
return 0;
}
height: 8
area: 25.600000
width: 3.200000
%d
和%f
是占位符,用来指明后面的变量值在显示的时候所处的位置。\n
表示这一行结束,下次显示从下一行开始。
%d
用于int
变量,%f
用于float
型变量。
%f
默认会显示小数点后6位数字,可以用%.nf
的格式指定它显示n位小数:
printf("area: %.2f", area);
area: 25.60
2.5 读取输入
标准输入输出库中的另一个函数scanf
可以读取用户的输入,把值传递给变量。
scanf
和printf
类似,都需要用到%d
、%f
等格式来定义传入的数据:
// 接收值,存到指定的变量
scanf("%d", &height);
scanf("%f", &area);
运算符&
用来把收到的值存给指定的变量,通常是scanf
必须的。
2.6 定义宏
程序中经常使用到某些常量时,最好给这些常量命名,以便后期阅读程序的人明白该常量的含义。
C语言可以使用宏定义给常量命名,命名后的常量名称为宏。
#define PI 3.14159f
#define
是类似#include
的预处理指令,所以末尾不需要分号。
编译时,预处理器会把程序中出现PI
的地方都替换为开头为它定义的值。
宏的名字只使用大写字母,是程序员遵循的代码规范。(并不是C语言的要求。)
2.7 标识符和关键字
标识符
标识符是程序中对变量、函数、宏和其他实体的命名。
标识符可以使用字母、数字、下划线,但是必须以字母或下划线开头。
C语言是区分大小写的,字母大小写不同的标识符有完全不同的意义,定义时尽量让无关的标识符看起来不同。
标识符的长度是有限制的。C89只要求编译器记住前31个字符(C99是63个),因此编译器无法区别前31个字符相同的两个标识符。
传统的程序员定义标识符一般使用小写字母加下划线的规范。另一种风格是把每个单词的首字母大写,不使用下划线。后一种风格由于在Java、C#中广泛使用而更加流行。
// 下划线连接单词
current_page
// 单词首字母大写
currentPage
不能作为标识符的关键字
C语言内置的关键字,对编译器来说有特殊意义,不能被用户当做标识符使用。
数据类型关键字
关键字 | 说明 |
---|---|
char | 声明字符变量 |
int | 声明整型变量 |
short | 声明短整型变量 |
long | 声明长整型变量 |
float | 声明浮点型变量 |
double | 声明双精度浮点型变量 |
signed | 声明有符号类型变量 |
unsigned | 声明无符号类型变量 |
struct | 声明结构体变量 |
union | 声明共用体或联合数据类型 |
void | 声明函数无返回值或无参数;声明无类型指针 |
enum | 声明枚举类型 |
控制语句关键字
关键字 | 说明 |
---|---|
if | 条件语句 |
else | 条件语句的否定分支 |
swich | 多条件判断语句 |
case | switch语句的一个分支 |
default | switch语句的默认分支 |
for | 遍历型循环 |
while | 条件循环 |
do | 和while结合创建至少执行1次的循环 |
break | 退出循环或switch |
continue | 跳过本轮循环,开始下轮循环 |
goto | 直接跳转到程序中的标记位置 |
return | 函数终止,返回结果 |
存储类型关键字
关键字 | 说明 |
---|---|
auto | 声明自动变量 |
extern | 声明其它文件定义的变量 |
register | 声明寄存器变量 |
static | 声明静态变量 |
其它关键字
关键字 | 说明 |
---|---|
const | 声明只读变量 |
sizeof | 计算数据类型的大小 |
typedef | 为数据类型取别名,用于自定义数据类型 |
volatile | 修饰的对象不能被编译器优化 |
C99新增的关键字
关键字 | 说明 |
---|---|
inline | 用于函数定义,让编译器把函数代码直接插入调用处,提高程序效率 |
restrict | 用于指针声明,该指针是访问某一块内存区域的唯一途径 |
_Bool | 引入布尔类型,存储0或1,使逻辑运算更直观 |
_Complex | 声明复数类型 |
_Imaginary | 声明纯虚数类型,和_Complex配合使用 |
2.8 C程序书写规范
C程序可以看作一连串记号组成的,每个记号是无法在不改变含义的条件下分割的字符组。
标识符和关键字是记号,运算符、逗号、分号也是记号。
一般情况下,记号之间的空格数量没有严格规定,除非他们并在一起后会产生第三个记号,否则它们之间是不需要留空格的。但是添加足够的间隔可以让程序变得易读。C语言允许在记号之间插入任意数量的空格符、制表符和换行符,C程序的书写规范由此而来。
- 过长的语句可以分开放在任意多行内
- 记号间尽量使用空格分开,便于区分
- 嵌套程序使用缩进,更容易识别
- 空行可以将程序分为不同的块,更易于辨别其逻辑结构