温故知新——通过C primer plus重学C语言(一)
引言
博主即将毕业参加工作,从事C语言开发,借此机会在就业之前把基础打牢,今天开始准备陆续整理、记录一些列从找工作开始所学习的技术栈。目的
有二:
其一:温故知新,随手笔记梳理已学知识点、主要包括C语言基础
,算法
以及数据结构
等;
其二:分享知识,方便给后来之人一些参考,当然也仅限于参考,因为本人的学识浅薄,会有一些疏漏之处,需要读者们能积极指出。
温故知新系列本人打算出三个系列:也就是上面提到的C语言基础
以及基于C语言的算法
和数据结构
。当前为第一个系列:C语言基础
具体章节规划
目前的打算是以Stephen Prata的《C Primer Plus》(第6版)的章节作为基础来划分,每一章主要是本人学习过程中整理的笔记以及习题。
一、数据类型
重要概念:位(bit
)、字节(Byte
)、字(word)
bit是最小存储单元;8bit=1Byte
基本数据类型由11个
关键字组成:int, long, short, unsigned, char, float, double, signed, _Bool, _Complex
和_Imaginary
1.1 整型和浮点型
1.1.1 整型
- 有符号整型
int
根据计算机不同有16bit
或32bit
长度,其中左侧第一位为符号位。16bit的int范围为-32768~32767
(熟悉范围很重要,这样可以在适当的位置使用适当的类型,避免数据溢出等错误)。 - C语言默认为十进制、但也可以通过转换说明
%o
来打印成八进制%x
来打印成十六进制。 - 其他整型
short int
即short
(16bit)、long int
(32bit)、long long int
(64bit)、unsigned int
。其中unsigned int
范围为0~65535
;另外,关键字signed
和unsigned
可以控制是否是有符号类型。 - 另外一提:
size_t
是一种很重要的特殊的int类型(我个人是这么理解的),目前看到比较好的解释:
1.1.2 浮点型
float
:至少6位有效数字,且取值范围至少是10-37到1037,一般占16bitdouble
:至少10位有效数字,一般占64bitlong double
:至少与double精度相同- 以float类型的
1.6e-19
为例,32bit中前24位存储尾数(有效数)即1.6
后8位存储指数的符号和值e-19
- 默认情况下编译器假定
浮点型常量
如4.0
,是double
类型,运算过程中可能会发生数据截断,导致速度变慢。在浮点型常量后面加上f或F可以覆盖默认设置如4.0f - C99标准中添加了十六进制表示的浮点型常量,可用p计数法例:
0xa.1fp10
- 使用浮点数据时要注意防止上溢和下溢
1.2 字符型
书中原话是这么描述char
类型的:“char类型用于存储字符,但从技术层面看,char时整数类型。”一般计算机都是按照ASCII码处理字符,ASCII码范围为0~127
即27,通常char占8位,足够使用。
C语言中用单引号''
括起来的为字符常量
打印非字符–转移序列
转移序列不多介绍,这里只是做了转移序列的汇总(书中的表3.2)
转移序列 | 含义 |
---|---|
\a | 警报(ANSI C) |
\b | 退格 |
\f | 换页 |
\n | 换行(比较常用) |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\\ | 反斜杠 |
\’ | 单引号 |
\" | 双引号 |
\? | 问号 |
\Ooo | (注意第一个是大写的o,不是零)每个o表示0到7中的一个 |
\xhh | 每个h表示0到7中的一个 |
1.3 _Bool型(循环和分支结构常用)
布尔值表示true
和false
,原则上只占1bit
C语言中非0(一般用1)为真,0为假
1.4复数和虚数类型
C99标准支持复数和虚数类型,科学计算中常用,这里就暂不详列了
1.4 字符串(这里只是简单提一下,后续会有详细内容)
一句话概括:字符串=字符数组+'\0'
二、常量
2.1 const限定符
C90新增关键字,限定一个变量
为只读
例如const int MONTHS = 12
2.2 明示常量
通过#define
定义的常量。例如C头文件limits.h和float.h分别定义了整型和浮点型数值的大小:
#define INT_MAX +32767
#define INT_MIN -32768
三、格式化输入输出:printf()
与scanf()
printf()与scanf()为输入输出函数,也叫I/O函数
这里整理汇总一下printf()
与scanf()
的转换说明、及转换说明的修饰符,可以方便查阅。当然常用的还是要记下来。
3.1 printf()
常用转换说明及修饰符
3.1.1 转换说明
转换说明 | 输出 |
---|---|
%a | 浮点数、十六进制数和p记数法(C99/C11) |
%A | 浮点数、十六进制数和p记数法(C99/C11) |
%c | 单个字符 |
%d | 有符号十进制整数 |
%e | 浮点数,e记数法 |
%E | 浮点数,e记数法 |
%f | 浮点数,十进制记数法 |
%g | 根据值的不同,自动选择%f或%e。%e格式用于指数小于-4或者大于等于精度时 |
%G | 根据值的不同,自动选择%f或%E。%E格式用于指数小于-4或者大于等于精度时 |
%i | 有符号十进制整数(和%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x |