C++中auto类型说明符详解(附易错实例)

 更新时间:2023年07月21日 15:29:12   作者:陈大大陈  
这篇文章主要给大家介绍了关于C++中auto类型说明符的相关资料,文中还附易错实例,在C++11中引入了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";
	for (int i = s.size() - 1; i >= 0; --i)
		cout << s[i];
	return 0;
}

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

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

总结

到此这篇关于C++中auto类型说明符详解的文章就介绍到这了,更多相关C++ auto类型说明符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ decltype 说明符

    C++ decltype 说明符

    这篇文章主要介绍了C++ decltype 说明符,检查实体的声明类型,或表达式的类型和值类别。下面我们来看看文章中的具体内容吧

    2021-12-12
  • C语言实现简单五子棋小游戏

    C语言实现简单五子棋小游戏

    这篇文章主要为大家详细介绍了C语言实现简单五子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C++制作DLL文件的方法详解

    C++制作DLL文件的方法详解

    本文主要介绍如何制作DLL,将代码类中的方法以接口的形式暴露出来给exe程序使用。会涉及类厂创建方法实例、声明DLL接口、.def文件的使用等,感兴趣的可以了解一下
    2023-04-04
  • C++实现LeetCode(118.杨辉三角)

    C++实现LeetCode(118.杨辉三角)

    这篇文章主要介绍了C++实现LeetCode(118.杨辉三角),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 一文带你了解C语言中static关键字的3个作用

    一文带你了解C语言中static关键字的3个作用

    static这个关键字是“静态”的意思,在C语言里主要有3个作用。这篇文章主要通过一些简单示例为大家详细讲讲这3个左右,感兴趣的小伙伴可以了解一下
    2023-04-04
  • C++11正则表达式详解(regex_match、regex_search和regex_replace)

    C++11正则表达式详解(regex_match、regex_search和regex_replace)

    正则表达式(regular expression)是计算机科学中的一个概念,又称规则表达式,下面这篇文章主要介绍了C++11正则表达式(regex_match、regex_search和regex_replace)的相关资料,需要的朋友可以参考下
    2022-09-09
  • Qt实现屏幕底部冒泡效果

    Qt实现屏幕底部冒泡效果

    这篇文章主要为大家详细介绍了Qt实现屏幕底部冒泡效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • C/C++实现线性单链表的示例代码

    C/C++实现线性单链表的示例代码

    使用链存储结构的线性存储结构为线性单链表,本文将分别利用C语言和C++实现线性单链表,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • 基于重启后消失的注册表键值的详细介绍

    基于重启后消失的注册表键值的详细介绍

    本篇文章是对重启后消失的注册表键值进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C++实现LeetCode(2.两个数字相加)

    C++实现LeetCode(2.两个数字相加)

    这篇文章主要介绍了C++实现LeetCode(两个数字相加),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论