1、转义字符
2、常量
在程序运行期间,其数值不会被改变的量
2.1 字符常量
‘a’ ‘b’ ‘c’
2.2 整型常量
二进制:0110
八进制:066
十进制:99 -2
十六进制:0x234
注意:默认情况下,整型常量是有符号的int型(long、short、long long)
无符号的int型数:66U
长整型:66L
无符号的长整型:66UL
2.3 浮点型常量
小数:1.23 0.0001 10000(浮点型常量包含整型常量)
指数形式:(1e-4) 1e+4
2.4 字符串常量
“hello”占几个字节
注意:字符串以’\0’作为结束符
2.5 标识常量(宏)
#define 宏名 表达式
注意:
- 宏名一般用大写,小写也可以,因为为了和变量区分,所以用大写
- 宏后面没有分号
宏只是单纯的替换
宏函数(既有函数的特点又有宏的特点)
#define 函数名(形参) 函数体
注意:宏只是单纯的替换,不会考虑运算符的优先级问题,所以需要给每个形参加括号,整个表达式加括号
3、变量
如何定义一个变量?
存储类型 数据类型 变量名;
存储类型:决定了开辟的空间在内存中的哪个分区
数据类型:决定了要开辟的内存空间的大小
变量名:开辟的空间的名字
3.1 局部变量
定义在函数体(任何函数体)内部的变量
3.2 全局变量
定义在函数体外的变量
3.3 存储类型
存储类型:auto、extern、static、register
auto:修饰的变量存储在栈区,只能修饰局部变量
extern:修饰的变量存储在静态区,只能修饰全局变量
static:修饰的变量存储在静态区,可以修饰局部变量和全局变量
register:修饰的变量存储在寄存器中,只能修饰局部变量
总结:
- 除了static和register修饰的局部变量外,其他都存在栈区
- 全局变量存储在静态区
- 静态变量存储在静态区
3.4 初始化
初始化:在定义变量时对变量赋值
- int a = 10;//初始化
- int a;
a = 10;//赋值
总结:
- 全局变量没有初始化其值默认为0
- 局部变量没有初始化其值默认为随机值
auto:修饰局部变量,存储在栈区
register:修饰局部变量,存储在寄存器中,建议将变量存储在寄存器,可以提高程序的运行速度,最终是否在寄存器中,取决于编译器,如果没有寄存器,存储在栈区
extern:修饰全局变量,存储在静态区
程序可以有多个.c文件来组成,但是一个程序只能有且仅有一个main函数
作用:告诉编译器,这个全局变量已经在其他文件定义过了
static:修饰的变量在静态区,即可以修饰局部变量也可以修饰全局变量
1.static修饰局部变量,延长了局部变量的生命周期,如果局部变量没有初始化,其值为0,如果初始化只能初始化一次
2.修饰全局变量,只能在本文件内使用(限制了全局变量的作用域)
.5 生命周期和作用域
3.5.1生命周期
从什么时候开辟空间到什么时候释放空间
3.5.2 作用域
使用的范围
局部变量:
生命周期:从定义开始,到模块(大括号)结束
作用域:大括号内
static修饰的局部变量:
生命周期:从定义开始,到程序结束
作用域:大括号内
全局变量:
生命周期:从定义开始,到程序结束
作用域:整个程序
static修饰的全局变量:
生命周期:从定义开始,到程序结束
作用域:本文件内
4、数据类型转换
4.1 强制类型转换(我们自己转的)
4.2 隐式类型转换(编译器转的)
5、运算符
单算移关与,异或逻条赋
单目运算符、算术运算符、左移右移、关系运算符、按位与、异或、按位或、逻辑运算符、条件运算符、赋值
5.1 算术运算符
+、-、*、/、%、++、--
注意:%不能用于浮点数
++在前:++a 先自加,再赋值
++在后:a++ 先赋值,再自加
注意:如果++a或者a++自成立一条语句,都当作a = a+1
5.2 关系运算符
>、<、>=、<=、==、!=
5.3 逻辑运算符
&&、||、!
表达式1 && 表达式2
&&截断法则:有一个为假,结果就为假,前一个为假,后面就不进行运算了
表达式1 || 表达式2
||截断法则:有一个为真,结果就为真,前一个为真,后面就不再进行运算了
5.4 sizeof运算符
sizeof(数据类型) 或 sizeof(变量名)
5.5 三目运算符
表达式1?表达式2:表达式3
判断表达式1的值是否成立,如果成立,将表达式2的值作为整个表达式的值,否则,将表达式3的值作为整个表达式的值
5.6 逗号运算符
表达式1,表达式2,表达式3…………表达式n
从左至右依次计算每个表达式的值,将表达式n的值作为整个表达式的值
注意:逗号运算符的优先级是最低的,使用的时候加上括号
1. 设int i=2,j=3,k=4,a=4,b=5,c=3;,则执行表达式(a=i<j)&&(b=j>k)&&(c=i,j,k)后,c值是(3)
5.7 位运算符
&、|、~、^、<<、>>
5.7.1 与运算(&)
1101 0011
& 0110 0101
0100 0001
案例:将1101 0011的0~2位清零
1101 0011
& 1111 1000 (~0000 0111)à~0x7
1101 0000
5.7.2 或运算(|)
1101 0101
| 0110 1101
1111 1101
案例:将1101 0101的3~5位变成101
1101 0101
& 1100 0111
1100 0101
| 00101000
11101101
5.7.3 取反
~1101 0010 --->0010 1101
5.7.4 异或
相同为0,不同为1
1101 0010
^ 0100 1000
1001 1010
5.7.4 左移
左移:高位丢弃,低位补0
将1左移两位
0000 0001 –>0000 0100
5.7.5 右移
无符号数:地位丢弃,高位补0
有符号数:低位丢弃,正数高位补0,负数高位补1