C++的auto类型说明符详解 附易错实例

这篇具有很好参考价值的文章主要介绍了C++的auto类型说明符详解 附易错实例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 C++的auto类型说明符详解 附易错实例,C语言初阶以及进阶内容专栏,c++,算法,开发语言,数据结构,服务器

💯 博客内容:C++读取一行内个数不定的整数的方式

😀 作  者:陈大大陈

🚀 个人简介:一个正在努力学技术的准前端,专注基础和实战分享 ,欢迎私信!

💖 欢迎大家:这里是CSDN,我总结知识和写笔记的地方,喜欢的话请三连,有问题请私信 😘 😘 😘

目录

基本概念

易错点 

易错实例

实例详解

解决办法


基本概念

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";
	for (int i = s.size() - 1; i >= 0; --i)
		cout << s[i];
	return 0;
}

C++的auto类型说明符详解 附易错实例,C语言初阶以及进阶内容专栏,c++,算法,开发语言,数据结构,服务器

一句话总结,auto虽好,也不要贪杯哦。。。

除非你确保auto推导出来的类型是你想要的 。

C++的auto类型说明符详解 附易错实例,C语言初阶以及进阶内容专栏,c++,算法,开发语言,数据结构,服务器文章来源地址https://www.toymoban.com/news/detail-536142.html

到了这里,关于C++的auto类型说明符详解 附易错实例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL “error: ‘fd’: 未知重写说明符”

    有以下代码, mysql 的 include 和 lib 都已经加入附加目录, libmysql.lib 已经加入依赖库: 当编译时遇到如下错误: mysql server 5.5includemysql_com.h(291): error C3646: “fd”: 未知重写说明符 mysql server 5.5includemysql_com.h(291): error C4430: 缺少类型说明符 - 假定为 int mysql server 5.5includemysql

    2024年02月16日
    浏览(32)
  • static、extern、inline 说明符和链接属性

    在我初学 C++ 时, static 、 inline 、 extern 可能是最令我迷惑的 C++ 说明符,原因是它们在不同的语境下会发挥不同的作用,而且某些说明符的含义已经和以前不同,这加剧了我在查询资料时的困扰。所以今天决定好好总结一下。 首先要介绍 C++ 的两个概念: 存储期 和 链接 。

    2024年02月05日
    浏览(77)
  • C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”

    学习过程遇见的问题,出现两个警告,一个是关于 C6054 :可能没有为字符串“name”添加字符串零终警告,另一个是关于 C6064 :缺少“scanf_s”的整型参数(对应于转换说明符“2”,因为篇幅太长,本片只介绍C6064:缺少“scanf_s”的整型参数(对应于转换说明符“2”,警告C605

    2024年02月11日
    浏览(47)
  • 【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    🎥 屿小夏 : 个人主页 🔥个人专栏 : C++入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 上篇文章中,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的?for遍历竟然还有我们没见过的面

    2024年02月06日
    浏览(140)
  • 【c++速通】入门级攻略:引用详解 | auto的类型推导 | 不一样的for循环 | nullptr版本空指针

    🎥 屿小夏 : 个人主页 🔥个人专栏 : C++入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 上篇文章中,对函数重载和内联函数的作用和特性使用,进行了精细的详解。 引用和指针混不清?引用的抽丝剥茧!还有不用写类型可以自动推导的?for遍历竟然还有我们没见过的面

    2024年02月08日
    浏览(49)
  • 【C++】引用 | auto类型 |范围for |使用nullptr的原因

    引用不是新定义一个变量,而是 给已存在的变量取别名 ,编译器不会为引用变量开辟内存空间,它和它引用的变量 公用同一块内存空间 比如说 李逵,在家称为\\\"铁牛\\\", 江湖上人称\\\"黑旋风\\\" 这两个称号都是他的 b是a的引用,也就是起了一个别名,a再取了一个名称 同时改变别

    2024年01月16日
    浏览(40)
  • 0829|C++day7 auto、lambda、C++数据类型转换、C++标准模板库(STL)、list、文件操作

        封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个) 再把该容器中的对象,保存到文件中。 再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。

    2024年02月10日
    浏览(46)
  • 【C++】语法小课堂 --- auto关键字 & typeid查看实际类型 & 范围for循环 & 空指针nullptr

    🚩 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么? C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器, auto定义的

    2024年02月13日
    浏览(45)
  • 【C++】C++入门 auto关键字详解(C++11)

    前言 C语言中包括了auto,它可用于定义局部变量。但自从所有的非全局变量的缺省值假定为auto以来,auto就几乎很少使用了。 在C或者以前C++中,auto基本上可以被无视. 但是在C++11中auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器, a

    2024年02月08日
    浏览(50)
  • c++(8.29)auto关键字,lambda表达式,数据类型转换,标准模板库,list,文件操作+Xmind

    封装一个学生的类,定义一个学生这样类的vector容器, 里面存放学生对象(至少3个) 再把该容器中的对象,保存到文件中。 再把这些学生从文件中读取出来,放入另一个容器中并且遍历输出该容器里的学生。  1.模板类 2.异常(异常情况为取钱时取的钱小于0或者大于余额)

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包