1)非常见:auto、register、volatile、goto
2)存储相关:const、extern、register、volatile、static、auto、signed、unsigned
3)数据类型:char、short、int、float、long、double、struct、union、enum、void
4)逻辑控制:if、else、for、while、do、break、continue、return、default、switch、case、goto
5)特殊用途:sizeof、typedef
auto:
auto在定义变量的时候可以自动检测变量类型。——>int a=1,等同于auto a=1; float b=1.11;等同于 auto b=1.11;
auto修饰局部变量,表示这个变量是自动局部变量,自动局部变量分配在栈上。(既然是分配在栈上,说明他如果不初始化的话那么值就是随机的,全局变量的值初始化是0)
平时定义局部变量时就是定义的auto的,只是省略了auto关键字而已。auto的局部变量其实就是默认定义的普通的局部变量。
register :register关键字不常用,作用就是:用register修饰的变量编译器会尽量把它分配子寄存器中。(平时分配的一般变量都是在内存中)。分配在寄存器中用法是一样的,但是读写效率会高很多。所以说register修饰的变量用在那种变量被反复高频率的使用,通过改善这个变量的访问速度可以极大的提升程序运行效率。register编译器只能承诺尽量将register修饰的变量放在寄存器中,但是不保证一定放在寄存器中。主要原因是因为寄存器数量有限,不一定有用。(有些编译器会自动优化,就是把变量复制到cpu寄存器中。)
extern :
extern主要用来声明全局变量,声明的目的主要是在a.c中定义全局变量整个工程中都能使用该变量。(一个工程中同样的全局变量只能有一个。)
static :
用来修饰局部变量,形成静态局部变量。静态局部变量存储在 全局区(静态区),局部变量存储在栈区(跟函数参数值一样)。作用域是所在函数。
用来修饰全局变量,形成静态全局变量。静态全局变量存储在 全局区(静态区)。作用域是自身所在文件。(全局变量作用域是整个工程)
volatile:
一个定义为volatile 的变量是说这变量可能会被意想不到地改变。优化器在用到这个变量时必须每次都小心地重新读取内存中的值,而不是使用保存在寄存器里的备份值。 如果将将变量加上volatile,则编译器对此变量的读写操作不会被优化 。
volatile 用途:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;(如:标志变量)
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;
const:
const 修饰的变量具有只读的属性而且是全局的。const修饰的可以取地址,就是说指针可以指向它。而#define 定义的常亮是不能取地址的。
code:
标准C语言中没有。在单片机中code可以把常数和表格之类的放到ROM中去以节省RAM。(rom只读内存)
goto:从一下列子中可以看出 goto 可以跳出多重循环,跳到标号位置程序继续执行。但goto在程序太大了的时候,如果程序出错,很难调试找出错误,要慎用goto。
int main()
{
int i = 1;
while(1)
{
printf("在while(1)里
");
while(i++)
{
printf("i = %d
",i);
if(i > 3)
{
goto TiaoChu;
}
}
}
TiaoChu:
printf("程序结束
");
return 0;
}