关键字static
1.static 修饰局部变量时,相当于改变了其生命周期,但不改变作用域
2.static 修饰全局变量,代表该变量仅在本文件内有效(没有static 修饰 全局变量+声明之后支持跨文件引用)
3.static 修饰函数,该函数只在本文件内被调用或访问,不能跨文件访问(函数本身在另一个文件+声明之后支持跨文件引用)
对第一点的演示
没有static 修饰情况下的局部变量
#include<stdio.h>
#include<Windows.h>
void MyShow()
{
int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
int j = 0;
for (; j < 5; j++)
{
MyShow();
}
system("pause");
return 0;
}
出了作用域 i 的生命周期和作用域均无效
每次执行 for 循环的时候 i 都会被重新创建与赋值
加上了 static 之后
#include<stdio.h>
#include<Windows.h>
void MyShow()
{
static int i = 0;
i++;
printf("%d\n", i);
}
int main()
{
int j = 0;
for (; j < 5; j++)
{
MyShow();
}
//printf("%d\n", i); //这条语句如果加上会报错未定义i 从而能证明i的作用域并未改变
system("pause");
return 0;
}
i 只在第一次调用的时候创建一次,此后执行i++语句 但注意只改变了 i的 生命周期,但不改变作用域
对第二点的演示
code.c
#include<stdio.h>
#include<windows.h>
int g_value = 10;//定义
test.c
#include<stdio.h>
#include<Windows.h>
extern int g_value;// 声明
int main()
{
printf("%d\n", g_value);
system("pause");
return 0;
}
结果就是输出10
#include<stdio.h>
#include<windows.h>
static int g_value = 10;//定义
加上static 之后,报警,无法解析的外部符号g_value --链接性错误
定义与声明
定义只能定义一次(开辟空间+防止内容),而声明可以多次声明
对第三点的演示
code.c
#include<stdio.h>
#include<windows.h>
static void MyShow()
{
int i = 0;
i++;
printf("%d\n", i);
}
test.c
#include<stdio.h>
#include<Windows.h>
extern void MyShow();
int main()
{
MyShow();
system("pause");
return 0;
}
与二原理相同,加上static 之后无法解析的外部符号MyShow --链接性错误
全局变量和函数混用 static
code.c
#include<stdio.h>
#include<windows.h>
static int g_value = 10;//定义
void MyShow() //如果 static void MyShow() 会怎么样? 显然报警告
{
static int i = 0;
for (; i < 5; i++)
{
printf("%d\n", g_value);
}
}
test.c
#include<stdio.h>
#include<Windows.h>
extern void MyShow();
int main()
{
MyShow();
system("pause");
return 0;
}
关键字typedef
#include<stdio.h>
#include<Windows.h>
typedef unsigned int unit;
int main()
{
unsigned int num1 = 0;
unit num2 = 1;
printf("%d\n", num1);
printf("%d\n", num2);
system("pause");
return 0;
}
unsigned int 老的类型
unit 新的类型的名字 相当于 Int、 char 等等
unsigned 无符号
整型的每一种(int short long longlong)都有无符号(unsigned)和有符号(signed)两种类型,在默认情况下声明的整型变量都是有符号的类型,如果需声明无符号类型的话就需要在类型前加上unsigned。
1、signed是默认的,表示这个变量是有符号的,可以存储整数和负数。
2、unsigned则需要显示给出表示这个变量,没有符号值能存储数的大小,而且不能表示正负。
signed存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的signed能够存储的数的绝对值大小要小于undigned。
4、unsigned的作用就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。