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++里沒有越界檢測機制,即使正整數的值已經超過了字符串的長度,循環(huán)體依舊可以成功運行。
所以程序會莫名其妙的輸出亂碼。
而且,即使i從正整數值遞減到0,依然會因為剛才解釋的原因再次回到那個非常大的正整數值。
所以程序是一個死循環(huán)。
要解決死循環(huán)也非常簡單。
解決辦法
不用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類型說明符內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深入理解C++中的new/delete和malloc/free動態(tài)內存管理及區(qū)別介紹
這篇文章主要介紹了深入理解C++中的new/delete和malloc/free動態(tài)內存管理,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
VScode + keil開發(fā)環(huán)境搭建安裝使用過程
這篇文章主要介紹了VScode + keil開發(fā)環(huán)境搭建及安裝使用過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-07-07

