【C 语⾔】c 语⾔基础知识梳理(超全)
C 语⾔基础知识梳理
零、概述
写此篇博客的⽬的主要是为了梳理⼀下c语⾔基础知识,因为不会像c语⾔教程那样有很多例⼦,或者按照初学c语⾔的顺序,所以不推荐刚学习c语⾔的⼈阅读。(期末复习可以看看)本篇⽂章有什么:1. 对c语⾔系统的梳理2. 对⼀些使⽤的细节进⾏梳理3. 解答对使⽤c语⾔时产⽣的⼀些疑惑
4. 本篇内容基于“C语⾔程序设计-浙江⼤学-翁恺”、“C++ Primer”部分内容以及个⼈理解进⾏梳理,不充分之处欢迎指出
⼀、变量和基本类型
(⼀)基本类型
1、有符号常见类型⼤⼩及其范围
1byte(字节)=8bit(位);每个bit就是⼀个0或者1,byte是c语⾔⾥⾯数据的最⼩单位
常⽤2的次⽅:2=1282=256
2=32,7682=65,536
2=2,147,483,6482=4,294,967,296
2=9,223,372,036,854,775,8082=18,446,744,073,709,551,616
类型含义32位编译器中⼤⼩(⼀般)64位编译器中⼤⼩(⼀般)最⼩值(32位)最⼤值(32位)
78151631326364
bool(stdbool.h)
布尔类型1byte
1byte
false true
char
单个字符1byte
1byte
-22-1
short 短整形2byte 2byte -22-1int 整形4byte 4byte -22-1long 长整形4byte 8byte -22-1long long 长整形8byte 8byte -22-1float 单精度浮点数4byte 4byte -22double 双精度浮点数8byte 8byte -22long double
扩展精度浮点数12byte 16byte -22char*
字符常量或字符串常量
4byte
8byte
⽆意义
⽆意义
类型含义32位编译器中⼤⼩(⼀般)
64位编译器中⼤⼩(⼀般)
最⼩值(32位)
最⼤值(32位)
2、浮点数范围来由及其有效数字
这⾥单独讨论⼀下浮点数的取值范围,浮点数都遵循标准,所以:
4*8=32位的float的第1位是符号位,第2~9位有8位是指数位,第10~32位有23位是尾数位 
那么可以很容易看到float的范围是[-1*2≈1.7*10, 1*2≈3.4*10]
因为转换成IEEE754都要进⾏标准化,也就是将原来的整数点整数的形式转化成⼆进制点⼆进制的形式,然后将点的位置移动到左边第⼀个1之后,产⽣指数位。规定点之后的数填在尾数位上,所以31位前暗含了1,所以上⾯的范围会先乘个1。32位的指数位 = 移位数(左移⼀位+1,右移⼀位-1)+ 127得出。所以负数只有127(127-127=0),⽽正数有128(127+128=255)
8*8=64位的double的第1位是符号位,第2~12位有11位是指数位,第13~64位有52位是尾数位那么可以很容易看到float的范围是[-1*2≈8.988*10, 1*2≈1.797693*10] 
12*8=96或16*8=128位的long double的第1位是符号位,第2~16位有15位是指数位,在32位系统中第17~96位有80位是尾数位,在64位系统中第17~128位有112位是尾数位,那么范围是[-1*2≈5.9*10, 1*2≈1.1897*10](与尾数⼤⼩⽆关)。 
其实float的范围就已经⾮常⾮常⼤了,那为什么还会有double甚⾄long double呢,这是因为浮点数能准确记录量级,但是⽆法准确记录太长的数字,数字的有效位数值取决于尾数位的长度,我们可以总结成下表:
类型有效位数计算有效位数float 2=16,777,2168-1=7double 2=9,007,199,254,740,99216-1=15long double
2=2.4*10  / 2=1.038*1025-1=24 / 35-1=34
3、字⾯值常量
(1)⼗进制字⾯值
对于⼀个20=24=14,在c语⾔中对应表达为20(10进制)、024(8进制)、0x14(16进制)。默认情况下,⼗进制字⾯值的类型是int,如果int装不下就是long,再装不下就是long long。
(2)浮点数字⾯值
7
715153131313163631271281023102416383163841273812838(2)(2)1023307102430816383493116384493223+152+180+124112+134
(10)(8)(16)
对于⼀个浮点数可以表⽰为314.159也可以表⽰为  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.#INF00printf ("%f\n", -1/0.0);  // ⽆穷⼩。我的电脑上为:1.#INF00printf ("%f\n", 0.0/0.0);  // 空。我的电脑上为:-1.#IND00
5、总结
有符号的类型(除浮点数)的范围都是由[-2, 2-1](n为类型所占bit)⽆符号的类型(除浮点数)的范围都是由[0, 2-1](n为类型所占bit)
浮点数的范围与其指数位⼤⼩有关,为[-2, 2](m为指数位位数) 
(⼆)变量
1、定义变量
变量由⼀个类型声明符加⼀个或多个变量名组成的列表(c99及以后可以在函数内任意位置定义变量),例如:
int  a ;  // a 是int 类型的变量
double  b =1.0;  //b 是double 类型的变量,赋1.0为初值char  c , d ;  // c, d 是char 类型的变量
2、常⽤特殊前缀
(10)n-1n-1n {[2^(m-1)]-1}[2^(m-1)]
extern int a;// 声明⼀个int类型的变量a,⼀般⽤在.h⽂件中声明项⽬全局变量
const int b=1;// 定义⼀个不可变的变量b,使⽤const关键字都要赋初值
static int c=1;// 在函数中使⽤,只在第⼀次使⽤时初始化,相当于作⽤域在函数内的全局变量
typedef long long int;// 把long long当作int使⽤
基础c语言代码3、数组与初始化变量
int a=1;// 给a初始化为1
// 以下为C99加⼊的特性
int b[10]={1};// 第⼀个元素初始化为1,其他9个元素初始化为0
int c[10]={0};// 全部初始化为0,常⽤初始化⼿段
int d[10]={[1]=1,2,[4]=4};// 0 1 2 0 4 0 0 0 0 0
4、变量作⽤域
变量有两种类型:局部变量全局变量,变量作⽤域即变量可使⽤的范围。
对于局部变量可以简单理解为⼤括号{}内即为⼀个作⽤域,变量在哪个⼤括号内,作⽤域就在哪。
对于全局变量的作⽤域就是在当前的.c⽂件中,在.h⽂件声明后可以在整个项⽬内使⽤。
对于同名变量,⼩作⽤域的变量会在其作⽤域中覆盖⼤作⽤域的变量。
(1)局部变量与全局变量的差别
差别因素局部变量全局变量
初始值初始值取决于内存⾥的数(随机)⼀般为0,指针为null 作⽤域仅限于⼤括号内.c⽂件甚⾄项⽬ 
(三)字符串
字符串在c语⾔中有两种形式char*和char[],这⾥简单分辨下两者之间的不同。
char* c1="HelloWorld!"中,c1指向代码段中的常量,只读不写,且常量相同,指向的地址也相同。
char c2[]="HelloWorld!"中,c2指向堆栈段中的数据,可读可写,相当于把代码端的数据拷贝了出来。
(四)⾃定类型——结构体
结构体可以看作是⼀种个基础类型复合的类型。
// 声明如下:
struct DATE{
int year, month, day;
};
// ⼏种定义⽅式如下:
struct DATE date1;// 不赋初值
struct DATE date2={2020,4,5};// 根据结构体中的顺序赋初值,这⾥是年⽉⽇
struct DATE date3 ={.year=2020,.day=5};// 给单独变量赋初值
struct DATE *date4 =&date3;// ⽤指针取date3地址(指针后⾯会单独说)
// ⼏种赋值⽅式如下:
date3 =(struct DATE){.year=1999};// 将数据强制转换成struct DATE类型赋值
date3 = date2;// ⾃动赋值
date4->year=2010;// 对指针所指变量中的单⼀元素赋值
// 常⽤声明
typedef struct DATE2{
int year, month, day;
} D;
D date5;// 这样就可以不⽤写struct DATE2这么⼀长串,取⽽代之⽤D来表⽰
扩展:union
union作为关键字与struct类似,但是struct中每个成员都是单独的内存,⽽union只占最⼤成员变量的⼤⼩,通常⽤与⼆进制与⼗进制的转换。
union DATE{
int year;
int month;
int day;
};/* ⼀个union DATE只有⼀个int⼤⼩ */
扩展:enum枚举,枚举类似#define,但是有体系些(c语⾔的枚举不好⽤)
// 声明枚举, 默认下标RED:0, YELLOW:1, GREEN:2
enum COLOR1 {RED1, YELLOW1, GREEN1};
// ⾃定下标
enum COLOR2 {RED2=1, YELLOW2, GREEN2=5};
⼆、表达式
这⾥给出运算符优先级
优先级运算符名称或含义使⽤形式结合⽅向说明
1[]数组下标数组名[整型表达式]
左到右()圆括号(表达式)/函数名(形参表)
.成员选择(对象)对象.成员名

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。