关键字的秘密
专题一:关键字的秘密。包括以下章节:
- 基本数据类型分析
- auto,register,static分析
- if,switch,do,while,for分析
- goto,void,extern,sizeof分析
- const,volatile分析
- struct,union分析
- enum,typedef分析
小结
auto变量存储在程序的栈中,是默认属性
static变量存储在程序静态区中
register变量请求存储在CPU寄存器中
实例分析2-1:变量属性的使用
在函数内声明auto,register,static属性变量
#include <stdio.h>
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
return 0;
}
编译结果:
声明一个auto属性的全局变量
#include <stdio.h>
auto int g = 0;//声明一个auto属性的全局变量,编译出错
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
return 0;
}
编译结果:
声明一个register属性的全局变量
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
register int m = 0;//声明一个register属性的全局变量,编译出错
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
return 0;
}
编译结果:
打印auto,register,static属性变量的地址值
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
register int m = 0;//声明一个register属性的全局变量,编译出错
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
printf("0x%0X\n", (unsigned int)(long)&k);
return 0;
}
打印结果:
函数中声明static静态局部变量
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
//register int m = 0;//声明一个register属性的全局变量,编译出错
void f1()
{
int i = 0;
i++;
printf("%d\n", i);
}
void f2()
{
static int i = 0;//静态局部变量只会被初始化一次
i++;
printf("%d\n", i);
}
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
printf("0x%0X\n", (unsigned int)(long)&k);
for(i=0; i<5; i++)
{
f1();
}
for(i=0; i<5; i++)
{
f2();
}
return 0;
}
打印结果:
调用文件外部的全局变量
2-1.c
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
//register int m = 0;//声明一个register属性的全局变量,编译出错
extern int test2_g;//声明文件外的全局变量
void f1()
{
int i = 0;
i++;
printf("%d\n", i);
}
void f2()
{
static int i = 0;//静态局部变量只会被初始化一次
i++;
printf("%d\n", i);
}
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
// printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
// printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
// printf("0x%0X\n", (unsigned int)(long)&k);
//
// for(i=0; i<5; i++)
// {
// f1();
// }
//
// for(i=0; i<5; i++)
// {
// f2();
// }
printf("test2_g=%d\n", test2_g);
return 0;
}
2-2.c
int test2_g = 1;
打印结果:
调用文件外部的static静态全局变量
2-1.c
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
//register int m = 0;//声明一个register属性的全局变量,编译出错
extern int test2_g;//声明文件外的全局变量
void f1()
{
int i = 0;
i++;
printf("%d\n", i);
}
void f2()
{
static int i = 0;//静态局部变量只会被初始化一次
i++;
printf("%d\n", i);
}
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
// printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
// printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
// printf("0x%0X\n", (unsigned int)(long)&k);
//
// for(i=0; i<5; i++)
// {
// f1();
// }
//
// for(i=0; i<5; i++)
// {
// f2();
// }
printf("test2_g=%d\n", test2_g);
return 0;
}
2-2.c
static int test2_g = 1;
打印结果:
通过函数调用文件外部的static静态全局变量
2-1.c
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
//register int m = 0;//声明一个register属性的全局变量,编译出错
//extern int test2_g;//声明文件外的全局变量
extern int test2_func();
void f1()
{
int i = 0;
i++;
printf("%d\n", i);
}
void f2()
{
static int i = 0;//静态局部变量只会被初始化一次
i++;
printf("%d\n", i);
}
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
// printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
// printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
// printf("0x%0X\n", (unsigned int)(long)&k);
//
// for(i=0; i<5; i++)
// {
// f1();
// }
//
// for(i=0; i<5; i++)
// {
// f2();
// }
// printf("test2_g=%d\n", test2_g);
printf("test2_g=%d\n", test2_func());
return 0;
}
2-2.c
static int test2_g = 1;
int test2_func()
{
return test2_g;
}
打印结果:
调用文件外部的static静态函数
2-1.c
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
//register int m = 0;//声明一个register属性的全局变量,编译出错
//extern int test2_g;//声明文件外的全局变量
extern int test2_func();
void f1()
{
int i = 0;
i++;
printf("%d\n", i);
}
void f2()
{
static int i = 0;//静态局部变量只会被初始化一次
i++;
printf("%d\n", i);
}
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
// printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
// printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
// printf("0x%0X\n", (unsigned int)(long)&k);
//
// for(i=0; i<5; i++)
// {
// f1();
// }
//
// for(i=0; i<5; i++)
// {
// f2();
// }
// printf("test2_g=%d\n", test2_g);
printf("test2_g=%d\n", test2_func());
return 0;
}
2-2.c
static int test2_g = 1;
static int test2_func()
{
return test2_g;
}
打印结果:
通过函数调用文件外部的static静态函数
2-1.c
#include <stdio.h>
//auto int g = 0;//声明一个auto属性的全局变量,编译出错
//register int m = 0;//声明一个register属性的全局变量,编译出错
//extern int test2_g;//声明文件外的全局变量
//extern int test2_func();
extern int test2_ff();//不声明外部函数,也可以调用
void f1()
{
int i = 0;
i++;
printf("%d\n", i);
}
void f2()
{
static int i = 0;//静态局部变量只会被初始化一次
i++;
printf("%d\n", i);
}
int main()
{
auto int i = 0; //局部变量默认为auto属性
register int j = 0;//申请变量在CPU寄存器
static int k = 0;
// printf("0x%0X\n", (unsigned int)(long)&i);//这里需要强制类型转换
// printf("0x%0X\n", (unsigned int)(long)&j);//register属性变量不能获取其内存地址
// printf("0x%0X\n", (unsigned int)(long)&k);
//
// for(i=0; i<5; i++)
// {
// f1();
// }
//
// for(i=0; i<5; i++)
// {
// f2();
// }
// printf("test2_g=%d\n", test2_g);
// printf("test2_g=%d\n", test2_func());
printf("test2_g=%d\n", test2_ff());
return 0;
}
2-2.c
static int test2_g = 1;
static int test2_func()
{
return test2_g;
}
int test2_ff()
{
return test2_func();
}
打印结果: