目录
逻辑结构
if(条件表达式)
xxx(功能)
else
yyy(功能)
多可能性分支:switch(整型数字)
case 1 :
break;
case 2 :
break;
循环:for(次数) while(条件) do(while)
goto:同一个函数中的跳转
类型修饰符
相较于数据类型关键字限定的是资源土地的大小
类型修饰符修饰的是资源土地的位置
auto
最日常使用的类型
定义的时候什么都不写就默认auto,由系统默认分配(在内存中)
分配的区域如果在{}中,即属于栈空间
register
限制变量定义在寄存器上的修饰符
当数据过于被频繁使用可以放在寄存器中
如果寄存器不足
系统还是会把a放到内存中去(&无法对寄存器中的数据取地址)
补充:(内存和寄存器的关系?)
左侧是在cpu中的寄存器,cpu执行操作时直接和寄存器通信是很快的
而右侧是内存,cpu和内存中的资源进行通信相对来说就比较慢
所以寄存器的大小一定程度上就体现了Cpu的执行效率
因此在cpu售卖时提到的XXX缓存即代表其寄存器中可以存储数据的大小
Static(静态)
1.对于函数内部的变量
int fun()
{
static int a;
}
2.对于函数外部的变量
static int a;
int fun()
{
}
3.修饰函数
static int fun();
Extern(外部申明)
Const
常量定义=>只能做到是一个只读的变量,通过某些方法还是可以改变它
Volatile
告知编译器编译方法的关键字,不优化编译
底层编程中比较常用
运算符
算数运算操作
加减乘除不再叙述
Tips:处理器中其实是没有乘除操作的,乘法除法往往要经过多个周期,甚至是通过软件的模拟方法实现乘除法
%:求模,求余数
由于任意一个变量和m求模
得到的范围就是【0——m-1】在取范围时可以使用
- 可以被用为求某进制下该数的个位上的数字
- 循环下标(在循环数据结构中)
逻辑运算
用1和0来表示真和假
|| 或 &&与
这里有一个优先级的关系
其导致的是
A || B 不等于 B || A
其原因为 如果编译器已经判断A是真的,那编译器接下来就会直接判断A||B表达式为真
B中包含的语句不会再被执行
所以两者并不能画上等号,执行关系优先级是不相同的
!
重点在于区别位运算中取反的操作
int a=0x0
! 整体取反=》31个0加1(4个字节)
~ 逐位取反=》32个全转成1 (0xffff)
?:
就是if else
位运算
移位
左移<< 右移>>
我们可以把操作看成乘法
由于位运算都在二进制下
因此左移就可以看成乘2(10进制)操作
0001 左移一位 0010
如果是数字的移位呢?
计算机中对负数数据的存储(8bit)是其)(符号位不动其他取反)反码+1
也就是说-1在计算机中的展示就是1111 1111
-2的展示就是1111 1110 所以左移乘2的操作依旧适用
右移:>>
此处有符号数和无符号数就有了差别
int a
有符号数中,如果是正数就补1,负数就补0
unsigned
无符号数默认补0
&,|
对应数字电路的与,或
&:可以起到屏蔽作用,取出作用(可以拿来设计低电平:clr)
int a=0x1234;
a & 0xff00
//这样的情况下低8bit就被屏蔽了
//高8bit就被取出了
|:可以起保留作用
A|1=1;设置高电平的一种方法 (设计高电平:set)
设置一个资源的bit5为高电平,其他位不改变
int a;
a=(a|(0x1<<5));
清除第五位
int a;
a=a & ~(0x1<<5)
设置4 5 6bit设置为101(?)
为什么不用右移:右移没办法准确知道当前操作系统位数(移植)=> 用取反肯定不会错
^,~
在数学算法中应用的比较多,几乎不用来处理逻辑
做两个数互换
(1)另创数备份一次
(2) a=a^b;
b=a^b;
a=a^b;
取反:逐位取反(和!的真和假有本质区别)
赋值运算
|= &= 都可以用,实现自更新
内存访问
():限制符—>限制运算次序
():函数访问fun()
[ ] :数组->内存访问的ID
{ }:函数体的限制符号
->:地址访问
.:变量访问
&p:就是取地址
*p:就是指针
(前提是后面跟的是变量)