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"; for (int i = s.size() - 1; i >= 0; --i) cout << s[i]; return 0; }
一句话总结,auto虽好,也不要贪杯哦。。。
除非你确保auto推导出来的类型是你想要的 。
总结
到此这篇关于C++中auto类型说明符详解的文章就介绍到这了,更多相关C++ auto类型说明符内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!