【C语言 C++】简单keywordRegister,Const,Static,Volatile,typedef,Define的理解
Register
用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器 中。但对32位编译器不起作用。当global optimizations(全局优化)开的时候,它会做出
选择是否放在自己的寄存器中;只是其他与registerkeyword有关的其他符号都对32位编译 器有效。
Const
被const修饰的东西都受到强制保护,能够预防意外的变动,能提高程序的健壮性。 它能够修饰函数的參数、返回值,甚至函数的定义体。(特别注意。在C语言中,const修
饰的变量本质依然是变量;而在C++中,则变为常量。
)
1>參数
a.对于非内部数据类型的输入參数,应该将“值传递”的方式改为“const引用传 递”。目的是提高效率。比如将void Func(A a) 改为void Func(const A &a)。
b.b.对于内部数据类型的输入參数,不要将“值传递”的方式改为“const引用传递”。
否则既达不到提高效率的目的,又减少了函数的可理解性。比如void Func(int x) 不应该改
为void Func(const int &x)。应该写成void Func(const int x)。
2>返回值
a.假设给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指 针)的内容不能被改动,该返回值仅仅能被赋给加const修饰的同类型指针。比如:const
char * GetString(void);char *str = GetString();//错误const char *str = GetString();//正确
b.假设函数返回值採用“值传递方式”,因为函数会把返回值拷贝到外部暂时的存储单元 中,加const修饰没有不论什么价值。
3>函数
const成员函数的声明中,constkeyword仅仅能放在函数声明的尾部,表示该类成员不修 改对象
Static
1>修饰变量
a.静态全局变量,作用域仅限于变量被定义的文件里。其它文件即使用extern 声 明也没法使用他。准确地说作用域是从定义之处開始。到文件结尾处结束,在定义 之处前面的那些代码行也不能使用它。
想要使用就得在前面再加extern。
b.静态局部变量,在函数体里面定义的,就仅仅能在这个函数里用了,同一个文档中 的其它函数也用不了。因为被static 修饰的变量总是存在内存的静态区,所以即使这个函
数执行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
2>修饰函数
函数前加static 使得函数成为静态函数。但此处“static”的含义不是指存储方式, 而是 指对函数的作用域仅局限于本文件(所以又称内部函数)。
使用内部函数的优点是:不
同的人编写不同的函数时,不用操心自定义的函数,是否会与其他文件里的函数同名。
Volatile
简单的说volatile的作用避免编译器优化。volatile提醒编译器它后面所定义的变量 随时都有可能改变,因此编译后的程序每次须要存储或读取这个变量的时候,都会直接从
变量地址中读取数据。假设没有volatilekeyword,则编译器可能优化读取和存储,可能暂 时使用寄存器中的值,假设这个变量由别的程序更新了的话,将出现不一致的现象。
typedef
typedef 的真正意思是给一个已经存在的数据类型(注意:是类型不是变量)取一个 别名, 而非定义一个新的数据类型
1>常规变量类型定义
Typedef unsigned char uchar //uchar a;(unsigned char a;)
2>数组类型定义
Typedef int arr[2] //arr a;(int a[2];)
Typedef int arr[M][N] //arr a;(int arr[M][N];)
3>指针类型定义
Typedef int *pointer //pointer p;(int *p;)
Typedef int *pointer[M] //pointer p;(int *p[M];)
4>函数声明
Typedef int fun(void) //fun f;(int f(void);)
//fun *p;(int (*p)(void);)
5>函数指针
Typedef int (*func)(void) //func p;(int (*p)(void);)
Define
在C或C++语言源程序中同意用一个标识符来表示一个字符串,称为“宏”。
keyword使用的总结。
1>无參宏定义
其定义的一般形式为:#define 标识符 字符串
a.宏定义是用宏名来表示一个字符串。在宏展开时又以该字符串代替宏名,这仅仅是一 种简单的代换,字符串中能够含不论什么字符,能够是常数,也能够是表达式,预处理程序对 它不作不论什么检查。如有错误。仅仅能在编译已被宏展开后的源程序时发现。
b.b. 宏定义不是说明或语句。在行末不必加分号。如加上分号则连分号也一起置换。
2>带參宏定义
带參宏定义的一般形式为: #define 宏名(形參表) 字符串
在宏定义中的參数称为形式參数,在宏调用中的參数称为实际參数。
对带參数的宏,在调 用中。不仅要宏展开,并且要用实參去代换形參。
3>防止反复定义
比如
#ifndef __headerfileXXX__
#define __headerfileXXX__
…
文件内容
…
#endif
【C语言 C++】简单keywordRegister,Const,Static,Volatile,typedef,Define的理解的更多相关文章
- void指针意义、Const、volatile、#define、typedef、接续符
1.C语言规定只有相同类型的指针才可以相互赋值. Void*指针作为左值用于接收任意类型的指针, void*指针作为右值赋给其他指针时需要强制类型转换. 2.在C语言中Const修饰的变量是只读的,本 ...
- const,static,volatile
1.static 作用 在C语言中,关键字static有三个明显的作用:1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.2). 在模块内(但在函数体外),一个被声明为静态的 ...
- C语言之extern、const、volatile
extern: extern修饰变量,声明该变量为外部文件的全局变量.若使用外部全局变量,必须用extern声明. extern修饰函数,声明该函数为外部函数.extern修饰的函数形参必须与原函数一 ...
- C语言中关键字auto、static、register、const、volatile、extern的作用
原文:C语言中关键字auto.static.register.const.volatile.extern的作用 关键字auto.static.register.const.volatile.exter ...
- C语言const和volatile关键字
这部分内容比较简单,我这里直接先做总结,然后通过写三个测试代码,体会其中的关键点 一.总结 1.const使得变量具有只读属性(但是不一定就是不能更改) 2.const不能定义真正意义上的常 ...
- C语言进阶——const 和 volatile 分析09
const只读变量: const修饰的变量是只读的,本质还是一个变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局函数区分配资源空间 const只在编译器有用,在运行期无用 ...
- C语言学习笔记--const 和 volatile关键字
1.const关键字 (1)const 修饰的变量是只读的,它不是真正的常量,本质还是变量,只是告诉编译器不能出现在赋值号左边! (2)const 修饰的局部变量在栈上分配空间 (3)const 修饰 ...
- C语言-const和volatile深度分析
1.const只读变量 const修饰的变量是只读的.本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 con ...
- 第9课 const和volatile分析
1. const只读变量——(注意不是真正常量,只是告诉编译器不能出现在赋值号左边!) (1)const修饰的变量是只读的,本质还是变量 (2)const修饰的局部变量在栈上分配空间 (3)const ...
- const和volatile
const是只读变量 const修饰的变量是只读的,其本质还是变量 const修饰的局部变量在栈上分配空间 const修饰的全局变量在全局数据区分配空间 const只在编译期有用,在运行期无用 con ...
随机推荐
- Adaboost和GBDT的区别以及xgboost和GBDT的区别
Adaboost和GBDT的区别以及xgboost和GBDT的区别 以下内容转自 https://blog.csdn.net/chengfulukou/article/details/76906710 ...
- 聊聊、RabbitMQ 配置文件
windows 下面安装 rabbitMQ 比较简单,但是想去改端口相关信息却找不到配置文件在哪.Linux 在 /etc/rabbitmq/rabbitmq.config 下面就可以找到.来看看 w ...
- [python][django学习篇][12]继续设计博客首页,点击博客标题能显示文章的详情
回顾一下开发流程:配置url, 编写视图函数,编写对应模板 配置URL 首页视图匹配的 URL 去掉域名后,是一个空的字符串.每篇文章的详情有着不同的 URL,因此可以设计文章详情页面URl:< ...
- ALPHA 冲刺(一)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示组内 ...
- 201621123034 《Java程序设计》第1周学习总结
1. 本周学习总结 知道了java的用途有安卓手机应用,企业服务器后端,java web.学到了新概念:类.HelloWorld.java 中 HelloWorld 是主文件名,区分 .java和 . ...
- POJ 3104:Drying(二分)
题目大意:你有一台机器可以烘干衣物,现在有n个衣物需要烘干,每件衣服都有一个值表示含水量,烘干机一秒可以烘干k滴水,一件衣服不在烘干机上时会每秒自动蒸发一滴水,求最少用多少时间烘干所有衣服. 分析: ...
- gcc编译生成静态及动态链接库步骤
gcc编译生成静态及动态链接库步骤 这两天在看<Linux C程序设计大全>,吴岳编著,清华大学出版社.这本书是在一个培训机构看到的,在网上查了下该书的相关信息.从目录而言,该书涵盖了Li ...
- pq
pq 题目描述 小q 的女朋友送给小q nn个整数.但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些. 小q 每次可以选择其中的两个x,yx,y (不能同时选择同一个数) 变成x− ...
- .NET and php
原文发布时间为:2011-12-29 -- 来源于本人的百度文章 [由搬家工具导入] http://www.php-compiler.net/blog/2011/phalanger-3-0
- RazorExtensions Templated Razor Delegates
原文发布时间为:2011-04-27 -- 来源于本人的百度文章 [由搬家工具导入] Templated Razor Delegates David Fowler turned me on to a ...