还有这种操作!!!!!(C语言关键字)
2017-10-18 20:10
169 查看
截至目前为止,C语言关键字共有32个,它们分别是:
1、{auto、static}//动态静态空间开辟
2、{char、short、int 、long 、float 、double 、unsigned 、signed}、//类型
3、{ if、 else 、do 、while、 switch、 case、 break、 default、 continue、 goto、 for }、//判断,选择,循环语法
4、{const 、enum、 extern、 register、 sizeof、 struct、 typedef、 union、 void、 volatile、 return }//特殊意义关键字
大致可分为这么4个类别,那么,接下来就简单介绍一下第4组,常用的特殊关键字。
No1,[b]**********const*********[/b]
在程序员编译过程中,可将不希望后期发生改变的变量加上const加以保护, 在C语言中,const 定义的常变量,具有常属性,其值不可改变,但本质上还是变量。在C++中,直接将const定义的变量当作常量处理。举个栗子:
No2、[b]**********enum*********[/b]
enum(枚举):简单的说枚举也是一种数据类型,这种数据类型只包含数据的集合,举个栗子:
用法: enum Sex sex=MALE;
No3、[b]**********extern*********[/b]
extern 是用于变量,函数声明的关键字。
实际上,程序若直接写int g_val;但主函数输出值将会把g_val按全局变量处理,输出值为0;为了区别,故而在变量前加上extern,来说明该条语句仅是变量(函数)声明。
No4、[b]**********register*********[/b]
register寄存器变量。
如图所示,运行速度寄存器>高级缓存区>内存>硬盘,故而,将一些运算数值较大的放在register中,作用是建议CPU优先从寄存器中取值处理,但
这种操作时错误的,&(取地址运算符)是找到变量在内存中的地址空间,而显然寄存器不属于内存中的一部分,所以&num找不到相应地址。
No5、[b]**********static*********[/b]
static静态变量的定义。
static修饰局部变量,改变局部变量的生命周期,不改变作用域
static修饰全局变量,改变全局变量的作用域,不改变生命周期
No6、[b]**********typedef*********[/b]
typedef类型定义形式:typedef 被替换类型 替换类型
上述例子中,多次出现unsigned int 类型,为了后继便于书写,可将该类型重新定义,如typedef unsigned int unit;后面凡遇到unsigned int 的地方均可用unit代替。如:unit age=20;
No7、[b]**********void*********[/b]
void 无返回值类型
No8、[b]**********volatile*********[/b]
voiltile保证内存的可见性,每次对num的值从内存中取,而并非从寄存器中直接取
这段代码执行完毕后,程序运行结果均为10,但观察内存可知,在程序运行的过程中num确实被改到20,这是什么情况哩?怎么解决?
No9、[b]**********sizeof*********[/b]
sizeof求变量内存空间所占字节数。用法形式为sizeof(类型)或sizeof(变量名),举个栗子:
No10、[b]**********struct********[/b]
代码九九归一,至于这第十个,struct,欲知后续结果,请看下回分解
1、{auto、static}//动态静态空间开辟
2、{char、short、int 、long 、float 、double 、unsigned 、signed}、//类型
3、{ if、 else 、do 、while、 switch、 case、 break、 default、 continue、 goto、 for }、//判断,选择,循环语法
4、{const 、enum、 extern、 register、 sizeof、 struct、 typedef、 union、 void、 volatile、 return }//特殊意义关键字
大致可分为这么4个类别,那么,接下来就简单介绍一下第4组,常用的特殊关键字。
No1,[b]**********const*********[/b]
在程序员编译过程中,可将不希望后期发生改变的变量加上const加以保护, 在C语言中,const 定义的常变量,具有常属性,其值不可改变,但本质上还是变量。在C++中,直接将const定义的变量当作常量处理。举个栗子:
void test() { const int num=1; int array[num]={0}; //在.C中,const 定义的常变量,具有常属性,但仍是变量,故而,这样书写是错误的,但在.cpp文件中,这样书写就是正确的,直接将num当作常量对待。 } #include<stdio.h> int main() { const int num=10; num=20;//这里对num进行了值得修改,程序失败 printf("%d\n",num); return 0; }
No2、[b]**********enum*********[/b]
enum(枚举):简单的说枚举也是一种数据类型,这种数据类型只包含数据的集合,举个栗子:
enum Sex { MALE, //0 FEMALE,//1 SECRET//2 };
用法: enum Sex sex=MALE;
enum Sex { MALE=1, //1 FEMALE=2, //2 SECRET=3 //3 }; //枚举允许附初值
No3、[b]**********extern*********[/b]
extern 是用于变量,函数声明的关键字。
extern int g_val;//变量声明 extern void test();//函数声明 int main() { void test();//hello world printf("%d\n",g_val);//2017 } void test() { printf("helloworld\n"); } int g_val=2017;
实际上,程序若直接写int g_val;但主函数输出值将会把g_val按全局变量处理,输出值为0;为了区别,故而在变量前加上extern,来说明该条语句仅是变量(函数)声明。
No4、[b]**********register*********[/b]
register寄存器变量。
如图所示,运行速度寄存器>高级缓存区>内存>硬盘,故而,将一些运算数值较大的放在register中,作用是建议CPU优先从寄存器中取值处理,但
register int num=10; &num
这种操作时错误的,&(取地址运算符)是找到变量在内存中的地址空间,而显然寄存器不属于内存中的一部分,所以&num找不到相应地址。
No5、[b]**********static*********[/b]
static静态变量的定义。
static修饰局部变量,改变局部变量的生命周期,不改变作用域
static修饰全局变量,改变全局变量的作用域,不改变生命周期
void test1() { static int a=1; a++; printf("%d",a); } static int g_val=1; void test2() { g_val=1;//变量赋值 g_val++; printf("%d\n",g_val); } int main() { int i=0; for(i=0;i<10;i++) { void test1();//2,3,4,5,6,7,8,9,10,11 void test2();//2,2,2,2,2,2,2,2,2,2 } return 0; }
No6、[b]**********typedef*********[/b]
typedef类型定义形式:typedef 被替换类型 替换类型
int main() { unsigned int age=20; unsigned int aver=20; unsigned int score=20; unsigned int size=20; printf("%d\n",age); }
上述例子中,多次出现unsigned int 类型,为了后继便于书写,可将该类型重新定义,如typedef unsigned int unit;后面凡遇到unsigned int 的地方均可用unit代替。如:unit age=20;
No7、[b]**********void*********[/b]
void 无返回值类型
void test() { printf("hello world\n"); } int main() { test(); test(1); test(1,2); test(1,2,3); } //屏幕上输出四次hello world
void test(void)//第一个void 代表函数无返回值,第二个代表函数无参 { printf("hello world\n"); } int main() { test(); test(1); test(1,2); test(1,2,3); } //编译错误,程序无法正常执行
No8、[b]**********volatile*********[/b]
voiltile保证内存的可见性,每次对num的值从内存中取,而并非从寄存器中直接取
int main() { const int num=10; int* p=(int*)# printf("%d\n",num);//运行结果为10 *p=20; printf("%d\n",num);//运行结果为10 }
这段代码执行完毕后,程序运行结果均为10,但观察内存可知,在程序运行的过程中num确实被改到20,这是什么情况哩?怎么解决?
int main() { volatile const int num=10; int* p=(int*)# printf("%d\n",num);//运行结果为10 *p=20; printf("%d\n",num);//运行结果为20 } //这里volatile 保证内存的可见性。
No9、[b]**********sizeof*********[/b]
sizeof求变量内存空间所占字节数。用法形式为sizeof(类型)或sizeof(变量名),举个栗子:
int main() { int a=10; int array[10]={0}; printf("%d\n",sizeof(int)); //4 printf("%d\n",sizeof(a)); //4 printf("%d\n",sizeof(array)); //4*10=40 return 0; }
No10、[b]**********struct********[/b]
代码九九归一,至于这第十个,struct,欲知后续结果,请看下回分解
相关文章推荐
- HTML中超链接原来还有这种操作??
- 还有这种操作?既是黑客又是居家男的阿里安全工程师
- 脑洞不是一般大!肆虐《绝地求生》的外挂还有这种操作?
- 原来还有这种操作,libs和jniLibs 还有jni不得不说的关系
- 还有这种操作?(一)
- tmux还有这种操作,我在这边的窗口上操作,你那边可以实时的看到我的操作,厉害了
- Vue还有这种操作?浅析几个新手常常忽略的API
- 无偿加班竟然被开除,还有这种操作?
- 还有这种操作?
- Docker+.Net Core 的那些事儿-4.还有这种操作!?
- 脑洞大开!LED应用居然还有这种操作
- 她用算法买到了房子!居然还有这种操作?!
- GAN还有这种操作!谷歌大脑和X实验室利用模拟条件和域适应提高机器抓取效率(附论文)
- Thinkphp5 还有这种操作?
- 还有这种操作?亿图在软件上也可以反激活!
- 代码干货 | 还有这种操作?javascript复制数组三种方式
- 思维导图大百科,还有这种操作?
- 碰瓷碰出新高度?团伙作案有预谋,一言不合就碰你,还有这种操作?
- CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- [脚本] 改自相机的MouseOrbit脚本,增加了相机距对象的高度,鼠标滚轮操作还有鼠标右键移动相机操作