C语言丨一文带你了解auto关键字(又名隐形刺客)
1.隐形刺客:auto
描述:这个这个关键字用于声明变量的生存期为自动,即将不在任何类、结构、枚举、联合和函数中定义的变量视为全局变量,而在函数中定义的变量视为局部变量。auto关键字在我们写的代码里几乎看不到,但是它又无处不在,它是如此的重要,又是如此的与世无争,默默的履行着自己的义务,却又隐姓埋名。
作用:C程序是面向过程的,在C代码中会出现大量的函数模块,每个函数都有其生命周期(也称作用域),在函数生命周期中声明的变量通常叫做局部变量,也叫自动变量。例如:
int fun(){
int a = 10; // auto int a = 10;
// do something
return 0;
}
int fun(){
int a = 10; // auto int a = 10;
// do something
return 0;
}
整型变量a在fun函数内声明,其作用域为fun函数内,出来fun函数,不能被引用,a变量为自动变量。也就是说编译器会有int a = 10之前会加上auto的关键字。
auto的出现意味着,当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。
2.C++98auto
早在C++98标准中就存在了auto关键字,那时候的作用是让变量变成自动变量,拥有自动的生命周期,但是临时变量在声明的时候本身就是自动生命周期了,所以这显得很多余。
int a =10 ; //拥有自动生命期
auto int b = 20 ;//拥有自动生命期
static int c = 30 ;//延长了生命期
取而代之,C++11就删除了原来的用法,改为了自动推导变量类型。auto 关键字可以用于变量类型的推断,我们可以在声明变量的时候根据变量初始值的类型自动为该变量选择合适的类型,而不需要我们显式指定类型。
3.使用auto进行类型推断
(1)普通类型的推断
auto x = 127; // auto 被推断为 int 类型
auto y = 3.14; // auto 被推断为 double 类型
auto z; // 错误,必须有初始值才能进行推断
(2)引用类型推断
int x = 0, &rx = x;
auto a1 = rx; // 使用引用其实是使用引用的对象,此时 auto 以引用对象的类型作为 auto 的类型,所以 auto 这里被推断为 int
auto &a2 = rx; // 此时 auto 被推断为 int 类型,a2 对象本身就是 int & 类型
const auto &a3 = rx; // auto 被推断为 int 类型,a3 对象本身是 const int & 类型,不能通过 a3 去修改 rx 引用的对象值
(3)const类型的推断
const int c = 10;
auto a1 = c; // auto 此时是 int,顶层 const 属性被丢弃
auto &a2 = c; // auto 此时是 const int,底层 const 属性保留
(4)针对数组和函数的推断
const char arr[] = "I Love China";
auto r1 = arr; // 如果将数组名赋值给 auto 变量,那么 auto 推断的结果是指针类型,如果有 const 属性
// 会被保留,auto 推断的结果是 const char *,r1 为 const char *
auto &r2 = arr; // 如果将数组名赋值给 auto & 变量,auto & 变量的类型是一个数组引用类型,即为
// const char (&) [14]
int add(int a,int b); // 函数声明
auto r3 = add; // r3 为 int(*)(int, int)
auto &r4 = add; // r4 为 int(&)(int, int)
推断规则说明
① 对于普通类型推断(没有 const 也不掺杂引用的),直接根据表达式右边值的类型进行推断,注意必须有初始值
② 使用引用进行推断,实际上就是使用引用对象的类型进行推断,此时引用特性会被丢弃,如果定义的对象需要成为引用,就自己在 auto 后面加上 & 来定义对象
③ 使用带有 const 属性的对象进行推断时,如果定义的对象不是指针或者引用,则 const 属性会被丢弃,否则 const 属性会保留,见 (3) const 类型的推断
auto关键字说明
auto 自动类型推断发生在编译期,所以使用 auto 关键字不会降低程序的运行效率。
4.auto关键字使用的场景
适用的场景
(1) 一些类型长度书写很长的,可以使用 auto 来简化,如 for(std::vector<int>::iterator it = v.begin();it != v.end();++it),如果使用 auto 可以直接写为 for(auto it = v.begin();it != v.end();++it)
(2) 当函数返回的值不确定时,可以使用 auto 做返回值类型,更加方便,编译器会根据返回值的类型推断 auto 的类型,这种语法是在 C++14 才出现的。
auto func() // 这种写法在 C++14 是允许的
{
return 0;
}
不适用的场景
(1) 函数参数类型不能是 auto 类型,比如 int add(auto a, auto b) { return a + b; } 是不允许的
(2) 类的成员变量不可以是 auto 类型。类的静态成员变量可以是 auto 类型的,但是需要使用 const 修饰,而且该变量的值在类内初始化
如果你想更好的提升你的编程能力,学好C语言C++编程!弯道超车,快人一步!
【C语言C++学习企鹅圈子】,分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习书籍:
编程学习视频:
C语言丨一文带你了解auto关键字(又名隐形刺客)相关推荐
- 干货丨一文带你玩转机器学习和深度学习
俗话说的好:工欲善其事,必先利其器!一款好的工具可以让你事半功倍,尤其是在大数据时代,更需要强有力的工具通过使数据有意义的方式实现数据可视化,还有数据的可交互性;我们还需要跨学科的团队,而不是单个数据 ...
- 【C语言】一文带你简单了解C语言
这里写目录标题) 引言 C语言概述 基础语法 数据类型 运算符 循环语句 分支语句 函数 数组 指针 文件操作 内存管理 高级特性 结构体 枚举类型 联合体 预处理器 应用场景 操作系统 编译器 游戏 ...
- 地铁文化丨一文带您云打卡西安地铁2号线二期车站
地铁2号线二期.16号线一期已于6月27日开通 文章目录 地铁2号线二期.16号线一期已于6月27日开通 不少小伙伴已前去探访打卡 如果您还没抽出时间亲身体验 地铁君这就邀您 云打卡地铁2号线二期各车 ...
- 深度学习学习路径丨一文带你零基础入行!建议收藏
深度学习到底有多热,这里我就不再强调了,也因此有很多人关心这样的几个问题,"适不适合转行深度学习(机器学习)","怎么样转行深度学习(机器学习)"," ...
- 干货丨一文带你读懂深度学习:AI 认识世界的方式如同小孩
编者按:本文由图普科技编译自 An AI That Knows the World Like Children Do. 如果你经常花时间和小孩子待在一起的话,你会不由得思考小孩子怎么能够学习得如此之快 ...
- 一文带你深入理解【Java基础】· Java基本语法:程序流程控制
写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...
- 一文带你深入理解【Java基础】· 数组
写在前面 Hello大家好, 我是[麟-小白],一位软件工程专业的学生,喜好计算机知识.希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正!谢谢大家!!! ...
- 一文带你入门go语言
一文带你入门go语言 go/golang是一门google开发的编程语言,其代码简洁易读,天生支持并发,完美契合当今互联网生态. 目前Go语言已经⼴泛应用于人工智能.云计算开发.容器虚拟化.⼤数据开发 ...
- c语言音标字符,c语言常见英语单词带音标-20210408030123.docx-原创力文档
集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN] 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN] C语言常见英语单词带音标 main [m ...
最新文章
- Image Watch的使用示例
- 6.8 程序示例--二分 K-Means-机器学习笔记-斯坦福吴恩达教授
- Converting slapd.conf to a Directory Based Configu
- (70)内核重载 xp sp3 x86 单核
- 运维学python用不上_不会Python开发的运维终将被淘汰?
- 事务传播特性和隔离级别
- 【转】卖场开设社区便利店,不仅卖货,还有家政服务、售后衔接等(图)
- wp8安装SSL证书
- 滴滴出行:10月国内月活用户突破4亿
- 向量自回归VAR模型、结构向量自回归SVAR模型、VMA模型
- yum源的三种安装配置方式,总有一款适合你
- 2021-09-20 Process finished with exit code -1073741515 (0xC0000135) QT Clion
- Java 飞翔的小鸟小游戏开发 完全源码 + 论文文档
- 零延迟!海康大华宇视网络监控摄像头RTSP浏览器网页无插件播放终极解决方案
- SOHUDBA/SOHU-DBProxy: 搜狐公司强大的数据库中间件
- python实时监控文件目录_教你三种方法,用 Python实时监控文件
- 为了到火星,天问一号究竟有多努力?
- 做wish用多大的虚拟服务器,虚拟海外仓适应于wish,ebay,速卖通,自营平台
- Django 学习记录
- 分布式计算领域的哥德尔Eric Brewer