【C语言】c语言基础知识梳理(超全)
C语言基础知识梳理
零、概述
一、变量和基本类型
(一)基本类型
1、有符号常见类型大小及其范围
2、浮点数范围来由及其有效数字
3、字面值常量
(1)十进制字面值
(2)浮点数字面值
(3)指定字面值类型
4、字符和字符串常量
5、总结
(二)变量
1、定义变量
2、常用特殊前缀
3、数组与初始化变量
4、变量作用域
(1)局部变量与全局变量的差别
(三)字符串
(四) 自定类型——结构体
二、表达式
三、语句
(一)条件语句
1、if语句
2、switch语句
(二)迭代语句
1、while语句
2、do while语句
3、for语句
(三)跳转语句
四、函数
(一)函数一般格式
(二)函数声明
(三)结构体中的函数
五、指针
(一)定义
(二)结构体与指针
(三)数组与指针
六、文件读取
(一)文本文件
(二)二进制文件
七、编译预处理指令与.h文件
(一)编译预处理指令
1、# include < stdio.h >
2、#define 名称 操作(宏定义)
3、(补充)inline内联函数
(二).h文件
(三)一些常用宏
八、常用函数
(一)常用函数
(二)scanf和printf
零、概述
写此篇博客的目的主要是为了梳理一下c语言基础知识,因为不会像c语言教程那样有很多例子,或者按照初学c语言的顺序,所以不推荐刚学习c语言的人阅读。(期末复习可以看看)
本篇文章有什么:
对c语言系统的梳理
对一些使用的细节进行梳理
解答对使用c语言时产生的一些疑惑
本篇内容基于“C语言程序设计-浙江大学-翁恺”、“C++ Primer”部分内容以及个人理解进行梳理,不充分之处欢迎指出
一、变量和基本类型
(一)基本类型
1、有符号常见类型大小及其范围
1byte(字节)=8bit(位);每个bit就是一个0或者1,byte是c语言里面数据的最小单位
常用2的次方:
27=128
28=256
215=32,768
216=65,536
231=2,147,483,648
232=4,294,967,296
263=9,223,372,036,854,775,808
264=18,446,744,073,709,551,616
类型 含义 32位编译器中大小(一般) 64位编译器中大小(一般) 最小值(32位) 最大值(32位)
bool(stdbool.h) 布尔类型 1byte 1byte false true
char 单个字符 1byte 1byte -27 27-1
short 短整形 2byte 2byte -215 215-1
int 整形 4byte 4byte -231 231-1
long 长整形 4byte 8byte -231 231-1
long long 长整形 8byte 8byte -263 263-1
float 单精度浮点数 4byte 4byte -2127 2128
double 双精度浮点数 8byte 8byte -21023 21024
long double 扩展精度浮点数 12byte 16byte -216383 216384
char* 字符常量或字符串常量 4byte 8byte 无意义 无意义
2、浮点数范围来由及其有效数字
这里单独讨论一下浮点数的取值范围,浮点数都遵循IEEE754标准,所以:
4*8=32位的float的第1位是符号位,第29位有8位是指数位,第1032位有23位是尾数位
那么可以很容易看到float的范围是[-12127≈1.71038, 12128≈3.41038]
因为转换成IEEE754都要进行标准化,也就是将原来的整数点整数的形式转化成二进制点二进制的形式,然后将点的位置移动到左边第一个1(2)之后,产生指数位。规定点之后的数填在尾数位上,所以31位前暗含了1(2),所以上面的范围会先乘个1。
32位的指数位 = 移位数(左移一位+1,右移一位-1)+ 127得出。所以负数只有127(127-127=0),而正数有128(127+128=255)
8*8=64位的double的第1位是符号位,第212位有11位是指数位,第1364位有52位是尾数位
那么可以很容易看到float的范围是[-121023≈8.98810307, 121024≈1.79769310308]
128=96或168=128位的long double的第1位是符号位,第216位有15位是指数位,在32位系统中第1796位有80位是尾数位,在64位系统中第17~128位有112位是尾数位,那么范围是[-1216383≈5.9104931, 1216384≈1.1897104932](与尾数大小无关)。
其实float的范围就已经非常非常大了,那为什么还会有double甚至long double呢,这是因为浮点数能准确记录量级,但是无法准确记录太长的数字,数字的有效位数值取决于尾数位的长度,我们可以总结成下表:
类型 有效位数计算 有效位数
float 223+1=16,777,216 8-1=7
double 252+1=9,007,199,254,740,992 16-1=15
long double 280+1=2.410 24 / 2112+1=1.0381034 25-1=24 / 35-1=34
3、字面值常量
(1)十进制字面值
对于一个20(10)=24(8)=14(16),在c语言中对应表达为20(10进制)、024(8进制)、0x14(16进制)。
默认情况下,十进制字面值的类型是int,如果int装不下就是long,再装不下就是long long。
(2)浮点数字面值
对于一个浮点数可以表示为314.159(10)也可以表示为3.14159e+2(科学记数法)。
默认情况下,浮点数字面值是一个double
(3)指定字面值类型
整形字面值
后缀 最小匹配类型 例子
u / U unsigned 20u / 20U
l / L long 20l / 20L
ll / LL long long 20ll / 20LL
浮点形字面值
f / F float 20.0f / 20.0F
l / L long double 20.0l / 20.0L
4、字符和字符串常量
形如’a’、"HelloWorld"都可以看作是常量,特别说明当例如char* s1=“HelloWorld”;char* s2=“HelloWorld”;时,s1和s2所指的都是内存中代码段的常量,可读不可写且地址相同,类似于const char* s1;
字符是以单引号’括住的单个字符,只占一个char(一个byte)
字符串以双引号"括住一系列字符,最后隐含了’\0’,所以占n+1个char(n为字符串有意义的长度)
特殊的常量:无穷,每个编译器的表示都不一样,可以使用如下代码输出:
printf(“%f\n”, 1/0.0); // 无穷大。我的电脑上为:1.#INF00
printf(“%f\n”, -1/0.0); // 无穷小。我的电脑上为:1.#INF00
printf(“%f\n”, 0.0/0.0); // 空。我的电脑上为:-1.#IND00
5、总结
有符号的类型(除浮点数)的范围都是由[-2n-1, 2n-1-1](n为类型所占bit)
无符号的类型(除浮点数)的范围都是由[0, 2n-1](n为类型所占bit)
浮点数的范围与其指数位大小有关,为[-2{[2^(m-1)]-1}, 2[2^(m-1)]](m为指数位位数)
