隨著計(jì)算機(jī)性能的持續(xù)提升,編程語(yǔ)言似乎迎來(lái)了一次大爆發(fā),各種編程語(yǔ)言不斷出現(xiàn),樂(lè)意折騰的人總能找到一門(mén)適合自己胃口的編程語(yǔ)言。
總能找到一門(mén)適合自己胃口的編程語(yǔ)言
程序員的口味大體可以分為兩種:一是追求極致程序效率,一是追求極致開(kāi)發(fā)效率。拋開(kāi)稍顯晦澀的匯編語(yǔ)言不談,前者以C語(yǔ)言程序員為代表,C語(yǔ)言語(yǔ)法簡(jiǎn)單,可控性強(qiáng),更貼近機(jī)器,適合開(kāi)發(fā)超高效率的程序。后者則以各種偏腳本化的語(yǔ)言程序員為代表,這類(lèi)編程語(yǔ)言更貼近人類(lèi),因此開(kāi)發(fā)效率很高。
Python程序中變量的類(lèi)型
下面是一段 Python 代碼,可以看出,Python 程序員在定義變量時(shí),甚至無(wú)需關(guān)心變量的類(lèi)型,只需寫(xiě)出核心邏輯即可:
#!/usr/bin/python # -*- coding: UTF-8 -*- counter = 100 # 賦值整型變量 miles = 1000.0 # 浮點(diǎn)型 name = "John" # 字符串
不過(guò),程序中變量的數(shù)據(jù)類(lèi)型本質(zhì)上是用于告訴計(jì)算機(jī)其占用內(nèi)存的大小,以及該如何解釋這段數(shù)據(jù)的。所以,即使是 Python 程序,在運(yùn)行時(shí)也需要確定變量的類(lèi)型,否則計(jì)算機(jī)就不知道如何存儲(chǔ)和解釋程序中的變量。當(dāng)然了,由于上面這段代碼沒(méi)有顯式的指定變量類(lèi)型,所以確定數(shù)據(jù)類(lèi)型的工作只能交給編譯器(或者說(shuō)解釋器)了。
Python使用變量非常簡(jiǎn)單
C++程序中變量的類(lèi)型
不要小看 Python 的這個(gè)特性,這可以省去相當(dāng)多的“鍵盤(pán)敲擊次數(shù)”。作為實(shí)例,可以參考下面這段C++程序片段:
... std::list
這個(gè)“定義”過(guò)程需要敲擊相當(dāng)多的字符
為了遍歷 list 中的元素,上述C++代碼定義了迭代器it,可以看出,這個(gè)“定義”過(guò)程需要敲擊相當(dāng)多的字符:“std::list
... std::list
代碼簡(jiǎn)潔許多
這樣的C++代碼并不影響閱讀,熟悉 list 的程序員一眼就能看出it是一個(gè)迭代器。
可能有讀者覺(jué)得將“確認(rèn)變量類(lèi)型”的工作交給編譯器會(huì)降低編譯效率,但是其實(shí)仔細(xì)想一下,應(yīng)該并非如此,請(qǐng)看下面這段C++代碼:
int a = 0; int *p = &a; a = p;
編譯器在處理第三行代碼時(shí),大都會(huì)報(bào)錯(cuò),給出類(lèi)似于下面這樣的信息:
error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive]
這說(shuō)明C++編譯器在處理變量賦值時(shí),也需要確定右值的類(lèi)型,因此從理論上來(lái)看,自動(dòng)推導(dǎo)類(lèi)型并不會(huì)帶來(lái)多少額外的工作。
C++中的auto關(guān)鍵字
事實(shí)上,C++11標(biāo)準(zhǔn)的確增加了“變量類(lèi)型自動(dòng)推導(dǎo)”的功能,只不過(guò)不像 Python,C++的這一功能需要借助auto關(guān)鍵字。
其實(shí)早在C++98標(biāo)準(zhǔn)中,就已經(jīng)存在auto關(guān)鍵字了,只不過(guò)那時(shí)的auto關(guān)鍵字僅用于聲明變量擁有自動(dòng)的生命周期,可是不使用 auto 關(guān)鍵字定義的變量仍然具有自動(dòng)的生命周期,所以那時(shí)的 auto 關(guān)鍵字屬于多余的特性。
C++11標(biāo)準(zhǔn)丟棄了auto關(guān)鍵字之前的特性,取而代之的,將此關(guān)鍵字用于定義“可自動(dòng)推導(dǎo)類(lèi)型”的變量。下面是一段C++代碼示例,請(qǐng)看:
int a = 8; auto b = a; // 自動(dòng)推導(dǎo) b 的類(lèi)型為 int cout << typeid(b).name() << endl;
自動(dòng)推導(dǎo)類(lèi)型的C++代碼示例
編譯這段C++代碼時(shí)應(yīng)注意指定C++11標(biāo)準(zhǔn):
# g++ t.cpp -std=c++11 # ./a.out i
可見(jiàn),程序輸出了i,表示變量 b 為 int 類(lèi)型,這說(shuō)明auto關(guān)鍵字的確根據(jù) b 的右值(int型的a)確定了 b 的類(lèi)型為 int。
現(xiàn)在有了auto關(guān)鍵字,前面那個(gè)遍歷 list 的C++代碼片段就可以改寫(xiě)了,請(qǐng)看:
for (std::list
顯然簡(jiǎn)潔了許多
顯然簡(jiǎn)潔了許多,C++程序員也可以少敲很多次鍵盤(pán),手指健康得到了一定程度的保護(hù)。
C++的 auto 關(guān)鍵字用于模板
上面只是C++中 auto 關(guān)鍵字的其中一種用法,事實(shí)上,auto 關(guān)鍵字不僅僅能夠讓程序員少敲代碼,也能帶來(lái)一些功能上的便利。例如,在定義模板函數(shù)時(shí),用于聲明依賴(lài)模板參數(shù)的變量類(lèi)型,下面是一段C++代碼示例:
template
請(qǐng)注意變量 v 的定義,如果這里不使用 auto 關(guān)鍵字就棘手多了,因?yàn)槲覀兏緹o(wú)法事先確定變量 x 和 y 的類(lèi)型,不到編譯的時(shí)候,誰(shuí)能知道 x+y 的結(jié)果究竟是什么類(lèi)型呢?
誰(shuí)能知道 x+y 的結(jié)果究竟是什么類(lèi)型呢?
讀者應(yīng)該注意到上面的 add() 函數(shù)其實(shí)并不好用,因?yàn)樗鼪](méi)有將結(jié)果返回給調(diào)用者。于是可以做如下修改,請(qǐng)看相關(guān)C++代碼:
template
可見(jiàn),auto 關(guān)鍵字也可用于自動(dòng)推導(dǎo)模板函數(shù)的返回值類(lèi)型,否則 add() 函數(shù)的返回值類(lèi)型也是相當(dāng)難確定的。不過(guò),在編譯這段C++代碼時(shí),發(fā)現(xiàn)如下警告信息:
warning: ‘a(chǎn)dd’ function uses ‘a(chǎn)uto’ type specifier without trailing return type [enabled by default] auto add(_Tx x, _Ty y)
要避免出現(xiàn)這樣的警告信息,可以使用C++11標(biāo)準(zhǔn)引入的新關(guān)鍵字decltype,相關(guān)的C++代碼如下,請(qǐng)看:
template
auto用于定義模板函數(shù)
auto 在這里的作用也稱(chēng)為返回值占位,它只是為函數(shù)返回值占了一個(gè)位置,真正的返回值是后面的decltype(x+y)?,F(xiàn)在編譯這段C++代碼,可以得到如下輸出,請(qǐng)看:
# g++ t.cpp -std=c++11 # ./a.out 9.14 7 145
注意事項(xiàng)
auto 關(guān)鍵字的“自動(dòng)推導(dǎo)類(lèi)型”功能是由編譯器提供的,而編譯器也不是占卜得到變量類(lèi)型的,它需要知道一些信息,因此 auto 在定義變量時(shí)必須初始化:
int i = 3; auto j = i;
只有這樣,編譯器才能根據(jù)右值的類(lèi)型推導(dǎo)出 auto 變量的類(lèi)型。也正是因?yàn)槿绱?,auto 變量作為函數(shù)的參數(shù)是非法的:
// 非法 void foo(auto a){ ... }
若是使用 auto 關(guān)鍵字在同一行定義多個(gè)變量,這些變量必須是同一類(lèi)型,否則編譯器就會(huì)報(bào)錯(cuò),例如下面這兩行C++代碼:
auto a1 = 1, a2 = 2;//正確 auto b1 = 10, b2 = 'a';//錯(cuò)誤,沒(méi)有推導(dǎo)為同一類(lèi)型
如果 auto 變量初始化時(shí)的右值為引用,則去除引用。請(qǐng)看下面這段C++代碼:
int a = 1; int &b = a; auto c = b; // 此時(shí) c 的類(lèi)型為 int c = 100; // a 依然為 1
如果希望自動(dòng)推導(dǎo)為引用類(lèi)型,則需要配合&運(yùn)算符:
auto &d = b; d = 100; // 此時(shí) a 為 100
類(lèi)似的,如果初始化表達(dá)式帶有 const 或者 volatile 修飾符,僅有 auto 定義的變量去除 const 和 volatile 修飾符。
最后要說(shuō)明的是,C++中的 auto 關(guān)鍵字并不是真正的類(lèi)型,它僅用于告訴編譯器“應(yīng)該自動(dòng)推導(dǎo)變量的類(lèi)型”,所以像 sizeof() 以及 typeid() 這樣操作數(shù)據(jù)類(lèi)型的操作符是不能用于 auto 的,下面這兩行C++代碼是非法的:
size = sizeof(auto); // 非法 cout << typeid(auto).name() << endl; // 非法
小結(jié)
本節(jié)主要討論了C++11標(biāo)準(zhǔn)中的 auto 關(guān)鍵字,可見(jiàn),它不僅能夠讓程序員少敲鍵盤(pán),提升了C++程序開(kāi)發(fā)效率,還額外提供了一些功能上的便利。文章在最后還討論了使用 auto 關(guān)鍵字的注意事項(xiàng),希望對(duì)讀者有所幫助。
點(diǎn)個(gè)關(guān)注吧
歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語(yǔ)言、linux等嵌入式開(kāi)發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。
-
C++
+關(guān)注
關(guān)注
22文章
2120瀏覽量
76461 -
編譯器
+關(guān)注
關(guān)注
1文章
1665瀏覽量
50856 -
變量
+關(guān)注
關(guān)注
0文章
615瀏覽量
29284
發(fā)布評(píng)論請(qǐng)先 登錄
能不能把導(dǎo)入的工程的編譯器也修改為argmgcc呢?
C++編譯器數(shù)值性能比較
MATLAB 64位C語(yǔ)言和C++編譯器應(yīng)用程序免費(fèi)下載

阿里云基礎(chǔ)軟件C/C++編譯器的工作現(xiàn)狀及挑戰(zhàn)

SuperH C/C++ 編譯器包 V.9.04 用戶(hù)手冊(cè)

C/C++編譯器的缺省字節(jié)對(duì)齊方式
SuperH C/C++ 編譯器包 V.9.01 用戶(hù)手冊(cè)

SuperH C/C++ 編譯器包 V.9.04 用戶(hù)手冊(cè)

C7000優(yōu)化C/C++編譯器

TMS320C6000優(yōu)化C/C++編譯器v8.3.x

MSP430優(yōu)化C/C++編譯器v21.6.0.LTS

評(píng)論