书中函数第7章,7.8节及以后的部分,这部分是学了函数后才用得到的,不过用上了函数的话这些概念就十分重要了
auto自动、static静态(存储在静态存储区)、register寄存器(快)
#include <stdio.h>
/*书中函数第7章,7.8节及以后的部分,这部分是学了函数后才用得到的,不过用上了函数的话这些概念就十分重要了
*/
int h;//定义全局变量,有效范围从此定义开始到本源文件结束
void test(int g)//形参,在本函数内有效,函数结束时销毁;【局部变量能“覆盖”_同名_全局变量】
{//本函数内有效【函数之内的局部变量】
//auto int a1;//自动变量【也是存储类别什么都不写时的缺省】动态存储区
int a2;//与上一行等价
//.新版C++定义auto不能和任何类型进行组合;
static int b;//static在局部变量时,程序内存不释放【就定义那次赋值,离开函数 值仍保留】静态存储区;用在全局变量时,外文件无法引用
register int c;//将局部变量的值放在寄存器中
for(int i=1;i<2;i++)//复合语句内有效,用完就释放;【复合语句内的局部变量】
{
printf("%d",i);
}
}
void main()
{
int d=20170513;//相应的,这也就只在main函数内有效
test(d);
}
static在全局变量使外部文件无法引用的方式在另一篇文章【函数_内部&外部/全局&局部_函数/变量】里。此处只讲静态局部变量
static这里着重讲一下
//P205例7.16
int main()
{
int f(int);//声明
int a = 2, i;
for (i = 0; i < 3; i++)
printf("%d\n", f(a));
return 0;
}
int f(int a)
{
int b = 0;//自动局部变量
static int c = 3;//静态局部变量
b = b + 1;
c = c + 1;
printf("a=%d,b=%d,c=%d\n",a,b,c);//这一句是我后加的
return(a + b + c);
}
运行结果:
a=2,b=1,c=4
7
a=2,b=1,c=5
8
a=2,b=1,c=6
9
这就是静态变量的深刻含义:函数调用时仍然不会被赋初值!(简直是全局变量了有木有!(雾))
书P206下方:(2)对静态局部变量在编译时赋初值的,即只赋值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而是只保留上次函数调用结束时的值。……而对自动变量赋初值,是在函数调用时进行的,每调用一次函数重新给一次初值,相当于赋值语句
另外提一嘴:
常变量 const
#define PI 3.14159
const float pi=3.14159
书上P42:可以说,常变量是具有名字的不变量,而常量是没有名字的不变量。
定义符号常量#define指令,它只是用符号常量代表一个字符串,在预编译时仅仅是进行字符替换,在预编译后,符号常量就不存在了(全换成3.14159了),对符号常量是不分配存储单元的。而常变量要占用存储单元,有变量值,只是该值不改变而已。
常变量具有符号常量的优点,而且使用更方便。