1、变量的存储类型
所有的数据都有两种类型,一种是数据类型,一种是存储类型。
数据类型:如int,float等
存储类型:四种存储类型的变量,自动变量(auto)、静态变量(static)、外部变量(extern)、以及寄存器变量(register)。
auto - 函数中所有的非静态局部变量。
register - 一般经常使用的变量(如一变量需计算几千次)可以设置成寄存器变量,register变量会被存储在寄存器中,计算速度远快于存在内存中的非register变量。
static - 在变量前加上static关键字的变量。
external - 把全局变量在其他源文件中声明成extern变量,可以扩展该全局变量的作用域至声明的那个文件,其本质作用就是对全局变量作用域的扩展。
2、变量的作用域和生存周期
存储类别 | 存储期 | 作用域 | 声明方式 |
---|---|---|---|
auto | 自动 | 块 | 块内 |
register | 自动 | 块 | 块内,使用关键字register |
static(局部) | 静态 | 块 | 块内,使用关键字static |
static(全局) | 静态 | 文件内部 | 所有函数外,使用关键字static |
extern | 静态 | 文件外部 | 所有函数外 |
代码如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
extern int extern_value = 16; //全局变量
static int yahuan_xiaoli = 24; //全局静态变量
int yahuan_extern = 30;
//寄存器变量
void register_demo() {
register int j = 0;
printf("j : %d\n", j);
//C++的register关键字已经优化, 如果我们打印它的地址,它就变成了普通的auto变量
printf("&j : 0x%p\n", &j);
}
//局部静态变量
void static_demo() {
static int girl = 18;
int yahuan = 17;
++girl;
++yahuan;
printf("girl : %d yahuan : %d\n", girl, yahuan);
}
//外部变量
void extern_demo() {
extern_value++;
printf("extern_value: %d\n", extern_value);
}
int main() {
int i = 0;//如果局部变量前面加类型说明符, 将会报错. 而C语言的auto不会报错, C++的auto已经升级了
register_demo();
static_demo();
static_demo();
static_demo();
extern_demo();
system("pause");
return 0;
}
程序运行结果: