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

news/2024/11/25 19:36:08/

 

💯 博客内容: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;
}

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

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


http://www.ppmy.cn/news/786249.html

相关文章

NLP 自然语言初体验

本资料整理自 Kaggle上的Spooky NLP and Topic Modelling tutorial import base64 import numpy as np import pandas as pd#Plotly imports 一种可视化工具 import plotly.offline as py py.init_notebook_mode(connectedTrue) import plotly.graph_objs as go import plotl…

面试常问集锦——Java基础部分

java基础部分 《我想进大厂》之Java基础夺命连环16问 https://mp.weixin.qq.com/s?__bizMzkzNTEwOTAxMA&mid2247485644&idx1&sndb46ab83196031d8f563585b72a7b511&chksmc2b24031f5c5c927bd125e219d4c2c810254f49ddc28988591978d27fe10a07eac85247bf89e&…

HappyDet安装使用教程

作者&#xff1a;堆堆星 导读 一般的深度学习流程包括数据采集&#xff0c;数据标注&#xff0c;训练&#xff0c;调参&#xff0c;测试&#xff0c;部署。流程繁琐&#xff0c;且周期极长。HappyDet以深度学习中目标检测算法为核心&#xff0c;开发了一套本地的全流程目标检测…

已经配置了`JAVA_HOME`环境变量,但Tomcat仍然提示未配置该变量

1. 检查JAVA_HOME变量的正确性&#xff1a;确保JAVA_HOME的值指向Java JDK的安装路径&#xff0c;而不是JRE的路径。例如&#xff0c;JAVA_HOME应该是类似于C:\Program Files\Java\jdk1.8.0_XXX的路径&#xff0c;而不是C:\Program Files\Java\jre1.8.0_XXX。 2. 检查环境变量…

计算机软件打开为什么跑一边,显示问题我的电脑有时新打开窗口总是跑到右边 – 手机爱问...

2009-08-31 不知道什么缘故&#xff0c;最近电脑桌面像凹凸镜那样在中间部分凹进去&#xff0c;字都扭成一团没法看了&#xff0c;整个桌面都变形了。还有有时会出现像电波干扰的那种情况&#xff0c;屏幕震动不稳。 我试过点右键-属性-桌面&#xff0c;把位置拉伸&#xff0c;…

android 电脑屏幕扩展,屏幕扩展与安卓版体验

屏幕扩展与安卓版体验 此次的YOGA BOOK采用了10.1英寸1080P HD分辨率的触控IPS面板&#xff0c;百分之70RGB色域&#xff0c;400尼特最大亮度&#xff0c;兼顾丰富色彩、高可视角度、大图幅和高锐利特点&#xff0c;素质相当不错。 YOGA BOOK屏幕素质了得 下面我们来讲一讲送测…

计算机开机民鸣叫不能启动,计算机开机并发出警报,详细教会您如果计算机长时间鸣叫怎么办...

使用计算机时,我的朋友经常在打开计算机电源时听到一声长鸣,然后不断发出蜂鸣声. 到底是怎么回事?实际上,这种现象通常是由内存问题引起的. 如果计算机在打开电源时持续发出哔哔声,该怎么办?下面,编辑器将向您说明打开计算机电源后如何处理长时间警报. 使用计算机的用户…

学无止境·MySQL③

单表查询 题一创建表并插入数据薪水修改为5000将姓名为张三的员工薪水修改为3000元将姓名为李四的员工薪水修改为4000元&#xff0c;gener改为女 题一 1.创建表&#xff1a; 创建员工表employee&#xff0c;字段如下&#xff1a; id&#xff08;员工编号&#xff09;&#xff…