C++的auto类型说明符详解 附易错实例_c++ auto语句定义错误用法


基本概念

C++11标准引入了auto类型说明符,auto类型说明符可以让编译器来分析表达式所属的类型

编译器通过什么来分析表达式的类型?

答案是通过变量的初始值。

所以,auto定义的变量必须有初始值。

auto i = 1 + 3;

i的初始值是1和3相加的结果。编译器会根据i的初始值自动推断变量i的类型。

1和3都是int类型,所以i的类型就是int。

以此类推,倘若它俩都变成double类型,那么i的类型就是double。

使用auto也能在一条语句中声明多个变量。

但是因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的数据类型都必须一样。

易错点
auto i=1+3,j=5;//正确,都为int类型
auto a=1.23,b=2//错误,一个double,一个int

需要注意的是,当使用auto声明一个引用类型或者const类型时,就不能让编译器自主判断了。

这种情况我们必须手动添加。

auto i=1+3;//i是int类型
auto &m=i;//m是绑定在i上面的一个int类型引用
const auto n=i;//n是值为4的常量
易错实例

auto是非常方便的语法,但是不能滥用,可能会有意想不到的错误。

像下面的情况,请你找一下错误所在吧!

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s = "123";
	for (auto i = s.size() - 1; i >= 0; --i)
		cout << s[i];
	return 0;
}
实例详解

你可能会自信地认为输出的结果是321.

那么很遗憾,你的答案是错误的

上面的代码会输出一堆乱码。

原因就在于auto上面。

仔细研究一下auto i = s.size() - 1;i被推导成什么类型了?是int类型吗?

事实上i被推导成了无符号整形。

因为s.size()返回的就是一个无符号整形。

无符号整形没有负数,计算机会把无符号整形的-1,-2等负数解释成非常大的正整数值

所以上述代码一直满足i >= 0的条件。

C++里没有越界检测机制,即使正整数的值已经超过了字符串的长度,循环体依旧可以成功运行。

所以程序会莫名其妙的输出乱码。

而且,即使i从正整数值递减到0,依然会因为刚才解释的原因再次回到那个非常大的正整数值。

所以程序是一个死循环

要解决死循环也非常简单。

解决办法

不用auto就行。。。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s = "123";


**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
![img](https://img-blog.csdnimg.cn/img_convert/4dda15d731dd1d3a78d14b8773c463b2.png)
![img](https://img-blog.csdnimg.cn/img_convert/2ccc0b4182a03de4ed2fd0f05bfaeaa9.png)
![img](https://img-blog.csdnimg.cn/img_convert/0d7c91c9be62b9dddec03005f528e60b.png)
![img](https://img-blog.csdnimg.cn/img_convert/c14ca6618a6bc47d02d2f942d34ac199.png)
![img](https://img-blog.csdnimg.cn/img_convert/b36ba6714522cc39bb595d8a2654d9dc.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!**

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
![img](https://img-blog.csdnimg.cn/img_convert/c2b1c605a0a69b2fbdb2e7ea6a985779.jpeg)

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**

**如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
[外链图片转存中...(img-SyPOItIQ-1712824265540)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值