类型修饰符 -- 总的来说就是对内存资源存放位置的限定
auto :默认情况分配内存可读可写的区域,区域在{}中一般认为为栈空间
对分配的内存修饰。
例如:
auto int a
register:限制变量定义在寄存器中的修饰符,可以定义一些快速访问的变量,如果寄存器不够时a任然会放到存储器中。&对register是无效的。简单的说就是修饰的变量优先放在寄存器中,如果寄存器没有位置,就放在储存器中。
例:
register int a。
static:静态
应用场景:
1、 修饰函数内部变量(局部)
Int fun()
{
Int a;==》static int a;
}
2、 修饰函数外部变量(全局)
3、 修饰函数
静态全局变量的作用域为定义它的此文件内有效, 在同一源程序的其它源文件中不能使用它。而非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的,但在别的文件中使用需要使用extern 修饰。
局部变量与局部静态变量不同的是它的存储方式即改变了它的生存期,static局部变量只被初始化一次,下一次依据上一次结果值;同时只要某个对象对静态变量更新一次,所有的对象都能访问更新后的值。
例如:
Int fun()
{
static Int a = 1;
printf(“%d”,a);
a++;
}
此函数输出的a会根据调用的次数增加,不会一直输出a为1.
修饰函数:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
const 常量 只读的变量 (不能直接更改如 const int a = 100; a = 200; 是不允许的,const int *a; 指针指向的内存空间不能被修改,int * const a
指针不能被修改,即指针a = NULL这样的操作不被允许 ),C语言中的const 修饰的变量可以通过一定的手段改变其中的值,但一般不更改,有告诉编译器和其他程序员此变量在此函数中使用并不改变其值方便代码理解和移植。
extern :外部声明,外部声明的变量别的文件可以访问。
volatile :告知编译器不优化编译 , 易变变量 ,可修饰变量使内存可见,一般操作硬件内存, 一般所修饰变量的值不仅仅可以通过软件更改,也可以通过其他方式更改。
例如:
int a = 100;
while( a==100 ) ;
在编译器编译的过程中第一次给a赋值后a为100,此后while循环没有再给a赋值,编译器会自动优化认为a就是100,如果外部条件改变a,编译器将不会跳出循环。使用volatile修饰可以让编译器不优化,每次都会检查a的值再去和100比较。
逻辑运算符
||:A||B 与B||A 不一样,有先后顺序,A||B若A为真,B将不执行
&&:A&&B 与B&&A不一样,A&&B若A为假,B将不执行。
以上A和B不一定是代表数字,也可以代表函数,注意不执行的情况。
! :逻辑取反,如:int A = 0x00; !a为真,除0之外的其他逻辑取反全为0;
~ :为逐位取反 按照2进制每一位都取反
位运算
<< 左移 :左移一位相当于乘以2,二进制下的移位
m<<n :相当于m*2^n
** >>** 右移:和符号变量相关,若变量有符号,正数 右移一位补0,负数最高位为1,其他为补0.
M>>n :相当于m/2^n
&: 屏蔽和取出 A&0 = 0;
例: int a = 0x1234;a&0xff00;
屏蔽低八位取出高八位
清除第五位,其他位不变 a & ~(0x1<<5);
|: 保留 A|1 = 1;
例:设置第五位为高电平,其他位不变 a| (0x1<<5);
^: 逐位操作,相同为0,不同为1,1^1 = 0; 1^0 = 1;
例:在不引入第三个变量时的换位赋值操作:
a = 1; b = 2;
a = a^b;
b=a^b;
a = a^b;
结果:a = 2; b = 1;
位运算都是2进制下逐位操作,不要带入十进制计算。