生活随笔
收集整理的這篇文章主要介紹了
C/C++关键字解析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2、C/C++分別有多少個(gè)關(guān)鍵字? 假如別人問(wèn)某一個(gè)關(guān)鍵字是否屬于C/C++,要能正確的答出來(lái)。
1)由ANSI標(biāo)準(zhǔn)定義的C語(yǔ)言關(guān)鍵字共32個(gè)
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根據(jù)關(guān)鍵字的作用,可以將關(guān)鍵字分為數(shù)據(jù)類(lèi)型關(guān)鍵字和流程控制關(guān)鍵字兩大類(lèi)。**1) 數(shù)據(jù)類(lèi)型關(guān)鍵字****A.基本數(shù)據(jù)類(lèi)型(5個(gè))**void :聲明函數(shù)無(wú)返回值或無(wú)參數(shù),聲明無(wú)類(lèi)型指針,顯式丟棄運(yùn)算結(jié)果char :字符型類(lèi)型數(shù)據(jù),屬于整型數(shù)據(jù)的一種int :整型數(shù)據(jù),通常為編譯器指定的機(jī)器字長(zhǎng)float :單精度浮點(diǎn)型數(shù)據(jù),屬于浮點(diǎn)數(shù)據(jù)的一種double :雙精度浮點(diǎn)型數(shù)據(jù),屬于浮點(diǎn)數(shù)據(jù)的一種**B .類(lèi)型修飾關(guān)鍵字(4個(gè))**short :修飾int,短整型數(shù)據(jù),可省略被修飾的int。long :修飾int,長(zhǎng)整形數(shù)據(jù),可省略被修飾的int。signed :修飾整型數(shù)據(jù),有符號(hào)數(shù)據(jù)類(lèi)型unsigned :修飾整型數(shù)據(jù),無(wú)符號(hào)數(shù)據(jù)類(lèi)型**C .復(fù)雜類(lèi)型關(guān)鍵字(5個(gè))**struct :結(jié)構(gòu)體聲明union :共用體聲明enum :枚舉聲明typedef :聲明類(lèi)型別名sizeof :得到特定類(lèi)型或特定類(lèi)型變量的大小**D .存儲(chǔ)級(jí)別關(guān)鍵字(6個(gè))**auto :指定為自動(dòng)變量,由編譯器自動(dòng)分配及釋放。通常在棧上分配static :指定為靜態(tài)變量,分配在靜態(tài)變量區(qū),修飾函數(shù)時(shí),指定函數(shù)作用域?yàn)槲募?nèi)部register :指定為寄存器變量,建議編譯器將變量存儲(chǔ)到寄存器中使用,也可以修飾函數(shù)形參,建議編譯器通過(guò)寄存器而不是堆棧傳遞參數(shù)extern :指定對(duì)應(yīng)變量為外部變量,即標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義const :與volatile合稱(chēng)“cv特性”,指定變量不可被當(dāng)前線程/進(jìn)程改變(但有可能被系統(tǒng)或其他線程/進(jìn)程改變)volatile :與const合稱(chēng)“cv特性”,指定變量的值有可能會(huì)被系統(tǒng)或其他進(jìn)程/線程改變,強(qiáng)制編譯器每次從內(nèi)存中取得該變量的值**2) 流程控制關(guān)鍵字****A .跳轉(zhuǎn)結(jié)構(gòu)(4個(gè))**return :用在函數(shù)體中,返回特定值(或者是void值,即不返回值)continue :結(jié)束當(dāng)前循環(huán),開(kāi)始下一輪循環(huán)break :跳出當(dāng)前循環(huán)或switch結(jié)構(gòu)goto :無(wú)條件跳轉(zhuǎn)語(yǔ)句**B .分支結(jié)構(gòu)(5個(gè))**if :條件語(yǔ)句,后面不需要放分號(hào)else :條件語(yǔ)句否定分支(與if連用)switch :開(kāi)關(guān)語(yǔ)句(多重分支語(yǔ)句)case :開(kāi)關(guān)語(yǔ)句中的分支標(biāo)記default :開(kāi)關(guān)語(yǔ)句中的“其他”分支,可選。**C .循環(huán)結(jié)構(gòu)(3個(gè))**1)for:for循環(huán)結(jié)構(gòu),for(1;2;3)4;的執(zhí)行順序?yàn)?->2->4->3- >2... 循環(huán),其中2為循環(huán)條件。在整個(gè)for循環(huán)過(guò)程中,表達(dá)式1只計(jì)算 一次,表達(dá)式2和表達(dá)式3則可能計(jì)算多次,也可能一次也不計(jì)算。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。2)do :do循環(huán)結(jié)構(gòu),do 1 while(2); 的執(zhí)行順序是1->2->1...循環(huán),2為循環(huán)條件3)while :while循環(huán)結(jié)構(gòu),while(1) 2; 的執(zhí)行順序是1->2->1...循環(huán),1為循環(huán)條件以上循環(huán)語(yǔ)句,當(dāng)循環(huán)條件表達(dá)式為真則繼續(xù)循環(huán),為假則跳出循環(huán)。
2)C++關(guān)鍵字
C++11 關(guān)鍵字共73個(gè)。
新增關(guān)鍵字:alignas、alignof、char16_t、char32_t、constexpr、decltype、noexcept、nullptr、static_assert、thread_local。
alignas
alignof用于獲取取指定表達(dá)式指定的(類(lèi)似sizeof,可以直接是類(lèi)型名)的對(duì)齊(alignment)。alignas用于聲明時(shí)指定對(duì)齊類(lèi)似于現(xiàn)有的類(lèi)型。和sizeof類(lèi)似,兩者的操作數(shù)都不被求值。
constexpr
類(lèi)似const但更強(qiáng)大,修飾函數(shù)或?qū)ο?#xff0c;表示函數(shù)結(jié)果或?qū)ο笫蔷幾g時(shí)決定的常量,以便優(yōu)化。(const不能修飾一般的函數(shù),也不一定指定聲明的對(duì)象能編譯期的常量表達(dá)式,更可能只是只讀對(duì)象。而在C語(yǔ)言中,const完全只能指定只讀對(duì)象。)
char16_t 和 char32_t
二者分別表示16位字符型和32位字符型,類(lèi)似char和wchar_t,也是一般只專(zhuān)用于表示字符的整數(shù)類(lèi)型,且設(shè)計(jì)上用于表示Unicode字符。char16_t和char32_t是C++11新增的,以克服wchar_t在不同平臺(tái)上無(wú)法保證確定寬度的缺點(diǎn)。
decltype
用于編譯時(shí)推斷類(lèi)型。此外參與函數(shù)聲明的另一種語(yǔ)法:指定返回auto,同時(shí)decltype引導(dǎo)trailing-return-type指定實(shí)際應(yīng)該返回類(lèi)型。decltype的操作數(shù)也不被求值。
nullptr
字面量nullptr是具有std::nullptr_t類(lèi)型的右值,是空指針常量。C++98/03中表示空指針常量的NULL或0都會(huì)在重載中引起混淆,而純庫(kù)的解決方案在這里也遇到困難,所以有必要加入新的關(guān)鍵字來(lái)專(zhuān)門(mén)表示空指針。
noexcept
實(shí)踐表明動(dòng)態(tài)異常規(guī)范會(huì)影響運(yùn)行時(shí)性能。新增的noexcept表示靜態(tài)異常規(guī)范,只指定函數(shù)(模版)是否有異常拋出,這里noexcept即noexcept(true),表示沒(méi)有異常拋出。除了異常規(guī)范,noexcept可以作用于一個(gè)表達(dá)式來(lái)判斷是否有異常,這對(duì)于模版代碼非常有用。
static_assert
用于編譯時(shí)的靜態(tài)斷言:若指定的表達(dá)式為false則編譯失敗。
auto
C++11標(biāo)準(zhǔn)和C++98/03標(biāo)準(zhǔn)的auto是不同的。C++98/03標(biāo)準(zhǔn)中,auto表示自動(dòng)儲(chǔ)存類(lèi)型[6] ;C++11標(biāo)準(zhǔn)中,auto表示由編譯器靜態(tài)判斷其應(yīng)有的類(lèi)型[4] 。
asm
用于語(yǔ)法:
asm-definition:asm ( string-literal ) ;
意義由實(shí)現(xiàn)定義,典型實(shí)現(xiàn)中傳輸其中的字符串給匯編器。
auto
在C++98/03中這個(gè)這個(gè)關(guān)鍵字用于聲明塊中的變量的生存期為自動(dòng)生存期,若是對(duì)象同時(shí)具有自動(dòng)存儲(chǔ)類(lèi),即生存期在塊結(jié)束時(shí)結(jié)束。這樣的變量被稱(chēng)為局部變量。這個(gè)關(guān)鍵字不常用,因?yàn)榧幢闶÷?#xff0c;聲明的默認(rèn)就是auto的。[6]
在C++11中,auto的含義改變?yōu)樽詣?dòng)通過(guò)初值符推斷聲明的類(lèi)型占位符。如聲明auto i = 1;,auto就相當(dāng)于int,因?yàn)?是int類(lèi)型,可以推斷出i的類(lèi)型。也可以使用auto& i等聲明,具體推導(dǎo)規(guī)則同模版參數(shù)類(lèi)型推導(dǎo)。[4]
*_cast
即const_cast、dynamic_cast、reinterpret_cast、static_cast。
C++風(fēng)格的類(lèi)型轉(zhuǎn)換。dynamic_cast是動(dòng)態(tài)的,需要運(yùn)行時(shí)支持;其它都是靜態(tài)檢查,相比C風(fēng)格的類(lèi)型轉(zhuǎn)換更加細(xì)化,增強(qiáng)了類(lèi)型安全性。
bool,true,false
bool即布爾類(lèi)型,屬于基本類(lèi)型中的整數(shù)類(lèi)型,取值為真和假。true和false是具有bool類(lèi)型的字面量,是右值,分別表示真和假。
break,continue,goto
break用于跳出for或while循環(huán)或switch。continue用于跳轉(zhuǎn)到循環(huán)起始。goto用于無(wú)條件跳轉(zhuǎn)到函數(shù)內(nèi)的標(biāo)號(hào)。結(jié)構(gòu)化程序較少使用goto,更多使用循環(huán)代替。
case,default,switch
switch分支語(yǔ)句的起始,根據(jù)switch條件跳轉(zhuǎn)到case標(biāo)號(hào)或defalut標(biāo)記的分支上。
catch,throw,try
用于異常處理。try指定try塊的起始,try塊后的catch可以捕獲異常。異常由throw拋出。throw在函數(shù)中還表示動(dòng)態(tài)異常規(guī)范,但在C++11中被標(biāo)記為過(guò)時(shí)(由noexcept部分取代)。
char,wchar_t
表示字符型和寬字符型這些整數(shù)類(lèi)型(屬于基本類(lèi)型),但一般只專(zhuān)用于表示字符。char(和signed char、unsigned char一起)事實(shí)上定義了字節(jié)的大小。
const,volatile
const和volatile是類(lèi)型修飾符,語(yǔ)法類(lèi)似,在C++中合稱(chēng)為cv-限定符(cv-qualifier)。可以共同使用。用于變量或函數(shù)參數(shù)聲明,也可以限制非靜態(tài)成員函數(shù)。const表示只讀類(lèi)型(指定類(lèi)型安全性,保護(hù)對(duì)象不被意外修改),volatile指定被修飾的對(duì)象類(lèi)型的讀操作是副作用(因此讀取不能被隨便優(yōu)化合并,適合映射I/O寄存器等)。
struct,class,union
用于類(lèi)型聲明。class是一般的類(lèi)類(lèi)型。struct在C++中是特殊的類(lèi)類(lèi)型,聲明中僅默認(rèn)隱式的成員和基類(lèi)訪問(wèn)限定與class不同(struct是public,class是private)。union是聯(lián)合體類(lèi)型。滿足特定條件類(lèi)類(lèi)型——POD struct或POD union可以和C語(yǔ)言中的struct和union對(duì)應(yīng)兼容。
class還有個(gè)用途是在模版類(lèi)型聲明中作為表示模版類(lèi)型參數(shù)或模版模版參數(shù)的語(yǔ)法的必要組成部分。前者也可被typename代替。
delete,new
delete單獨(dú)使用,表示釋放具有動(dòng)態(tài)存儲(chǔ)期對(duì)象,默認(rèn)版本調(diào)用全局的去配器(deallocator)::operator delete和析構(gòu)函數(shù)。new單獨(dú)使用,表示請(qǐng)求分配動(dòng)態(tài)存儲(chǔ)期對(duì)象,默認(rèn)版本調(diào)用全局的分配器(allocator)::operator new和指定的析構(gòu)函數(shù)。和operator連用表示分別表示去配器(operator delete)和分配器(operator new),用于釋放分配器(allocator)的內(nèi)存和分配內(nèi)存。operator delete也在分配內(nèi)存被異常中斷時(shí)被調(diào)用。
do,for,while
循環(huán)語(yǔ)句的組成部分。C++支持do-while循環(huán)、for循環(huán)和while循環(huán)。C++11新增了ranged-based for循環(huán),用:分隔聲明的對(duì)象和指定循環(huán)的范圍。
數(shù)值類(lèi)型
即double、float、long、int、short、signed、unsigned。
signed和unsigned作為前綴修飾整數(shù)類(lèi)型,分別表示有符號(hào)和無(wú)符號(hào)。signed和unsigned修飾char類(lèi)型,構(gòu)成unsigned char和signed char,和char都不是相同的類(lèi)型;不可修飾wchar_t、char16_t和char32_t。其它整數(shù)類(lèi)型的signed省略或不省略,含義不變。signed或unsigned可單獨(dú)作為類(lèi)型,相當(dāng)于signed int和unsigned int。
double和float專(zhuān)用于浮點(diǎn)數(shù),double表示雙精度,精度不小于float表示的浮點(diǎn)數(shù)。long double則是C++11指定的精度不小于double的浮點(diǎn)數(shù)。
其它關(guān)鍵字表示整數(shù)類(lèi)型。從占用空間大小(sizeof)來(lái)看,保證char<=short<=int<=long<=long long。注意這些都不是相同的類(lèi)型,即便大小和范圍都一致;各自具有unsigned版本。其中l(wèi)ong long是C++11指定的不小于long的整數(shù)。
if,else
條件語(yǔ)句的組成部分。if表示條件,之后else表示否定分支。
enum
構(gòu)成枚舉類(lèi)型名的關(guān)鍵字。C++11新增帶作用域的枚舉,用enum class或enum struct(兩者等價(jià))聲明。
explicit
這個(gè)關(guān)鍵字修飾構(gòu)造函數(shù)聲明,表示顯式構(gòu)造函數(shù)(模版),顯式構(gòu)造函數(shù)不參與特定的重載。
C++11從兩個(gè)角度擴(kuò)展了用法。其一是適用于轉(zhuǎn)換函數(shù)(模版),類(lèi)似構(gòu)造函數(shù),避免不需要的重載。其二是列表初始化,除非直接使用std::initializer_list,顯式構(gòu)造函數(shù)被列表初始化忽略(在C++98/03中,explicit僅對(duì)單一參數(shù)調(diào)用構(gòu)造函數(shù)有意義,這里打破了這個(gè)限制)。
export
導(dǎo)出模版,用于分離編譯。當(dāng)初標(biāo)準(zhǔn)委員會(huì)未經(jīng)充分實(shí)踐支持匆忙通過(guò)了這一決定,被EDG證明具備不現(xiàn)實(shí)的可用性(即便EDG唯一地實(shí)現(xiàn)了這一個(gè)特性,他們也表示反對(duì))[7] 。MSVC、GCC、Clang等其它主流編譯器前端都沒(méi)有實(shí)現(xiàn)這一特性,甚至這是唯一明顯約定不符合C++98/03的特性。C++11廢除了這個(gè)export關(guān)鍵字的含義,但保留這個(gè)關(guān)鍵字,供以后使用[3] 。
extern
extern意為“外來(lái)的”,是存儲(chǔ)類(lèi)聲明修飾符。這個(gè)關(guān)鍵字在C語(yǔ)言中即很不明確,容易被混淆(尤其是extern inline——好在C++沒(méi)有這種用法)。extern表示被修飾的聲明中,名稱(chēng)的鏈接保持和之前的一致(若已有相同聲明存在),或保持默認(rèn)值(若之前沒(méi)有相同名稱(chēng)的聲明存在)——取決于聲明的位置。在命名空間作用域(注意包括全局命名空間),extern表示外部鏈接;若這里省略extern,則對(duì)于const對(duì)象,默認(rèn)具有內(nèi)部鏈接;否則表示具有和命名空間一致的鏈接(若頂層沒(méi)有嵌套未命名的命名空間,就是外部鏈接,否則是內(nèi)部鏈接)。
C++11新增extern用于模版顯式實(shí)例化聲明,表示不在當(dāng)前翻譯單元實(shí)例化模版,而在別處有定義。這可以提升編譯效率。
friend
聲明友元,使其不受訪問(wèn)權(quán)限控制的限制。
inline
聲明定義內(nèi)聯(lián)函數(shù)(模版),提示編譯時(shí)內(nèi)聯(lián)——將所調(diào)用的代碼嵌入到主調(diào)函數(shù)中。注意是否內(nèi)聯(lián)取決于實(shí)現(xiàn)——編譯器有權(quán)不實(shí)際內(nèi)聯(lián),如果它認(rèn)為這是必要的或更符合預(yù)期的目標(biāo)代碼質(zhì)量。但inline還改變了ODR(One Definition Rule)的適用性。類(lèi)似函數(shù)模版,在頭文件直接定義inline函數(shù)不會(huì)視為重復(fù)定義違反ODR而編譯出錯(cuò)。C++中,一個(gè)函數(shù)若聲明inline,則每處聲明都必須保證是inline,和C語(yǔ)言允許extern inline或static inline不同——盡管C++實(shí)現(xiàn)可以提供類(lèi)似非標(biāo)準(zhǔn)的擴(kuò)展。注意類(lèi)成員函數(shù)若在類(lèi)定義內(nèi)給出定義則隱含inline。
C++11中,新增inline namespace,指示命名空間中的名稱(chēng)同時(shí)是外層命名空間直接包含的名稱(chēng)。這便于命名空間的版本管理,減少?zèng)_突。
mutable
用于類(lèi)的非靜態(tài)非const數(shù)據(jù)成員,表示不受到成員函數(shù)的const的限制,可以在const成員函數(shù)中使用。
namespace
表示命名空間——其中可以聲明若干標(biāo)識(shí)符,組成的名稱(chēng)與其它命名空間不沖突。
可以聲明一個(gè)命名空間或命名空間別名。
operator
和操作符連用,指定一個(gè)重載了的操作符函數(shù),也包括operator new和operator delete。
private,protected,public
指定類(lèi)成員或基類(lèi)中的名稱(chēng)的訪問(wèn)權(quán)限控制,分別表示僅供本類(lèi)使用、供本類(lèi)和派生類(lèi)使用、不設(shè)限制。
register
提示聲明的對(duì)象被放入寄存器中以便得到更好的性能。同inline類(lèi)似,并非強(qiáng)制;不同的是這個(gè)提示經(jīng)常被現(xiàn)代的編譯器無(wú)視,因此C++11中被標(biāo)記為過(guò)時(shí)的。
return
子程序返回語(yǔ)句,終止當(dāng)前函數(shù)執(zhí)行,使控制流返回到主調(diào)函數(shù)的調(diào)用后。若返回類(lèi)型不是void可以同時(shí)帶返回值。
static
和C語(yǔ)言類(lèi)似,聲明靜態(tài)存儲(chǔ)期對(duì)象,或指定一個(gè)函數(shù)的名稱(chēng)具有內(nèi)部鏈接。在C++還有另一個(gè)用途——用于類(lèi)作用域聲明,表示聲明的成員是類(lèi)共有的,不需要通過(guò)類(lèi)的對(duì)象訪問(wèn)。類(lèi)的靜態(tài)數(shù)據(jù)成員也具有靜態(tài)存儲(chǔ)期,除非被thread_local修飾。
sizeof
返回類(lèi)型名或表達(dá)式具有的類(lèi)型對(duì)應(yīng)的大小。不能對(duì)函數(shù)使用(雖然可能有非標(biāo)準(zhǔn)擴(kuò)展)。C++11新增支持直接對(duì)類(lèi)的數(shù)據(jù)成員作為操作數(shù)(之前無(wú)法使用)。sizeof的操作數(shù)是不被求值的,利用這一點(diǎn)可以配合模版元編程測(cè)試類(lèi)型正確性。
template
聲明一個(gè)模板、模版的特化或顯式實(shí)例化(另見(jiàn)extern)。模版用于打破類(lèi)型系統(tǒng)的某些限制,推遲類(lèi)型檢查到實(shí)例化得到具體的模版實(shí)例進(jìn)行以復(fù)用代碼,實(shí)現(xiàn)泛型和參數(shù)化編程。
this
this是一種實(shí)體,僅在類(lèi)的非靜態(tài)成員中使用,是指向類(lèi)的對(duì)象的指針右值。
typedef
用以給數(shù)據(jù)類(lèi)型取別名。字面名義上是定義,實(shí)際只是聲明——這點(diǎn)和C語(yǔ)言的說(shuō)法不同。
C++11中可被using新增的用法代替。
virtual
聲明虛基類(lèi)或虛函數(shù)。具有虛基類(lèi)或虛函數(shù)的類(lèi)是多態(tài)類(lèi)(polymorphic class),需要運(yùn)行時(shí)提供支持來(lái)判斷成員函數(shù)調(diào)用分派到的具體類(lèi)型。
typeid
獲取表達(dá)式的類(lèi)型,以std::type_info表示結(jié)果,可能拋出std::bad_typeid。當(dāng)操作數(shù)非多態(tài)類(lèi)(引用)類(lèi)型在編譯時(shí)即可確定結(jié)果,否則需要在運(yùn)行時(shí)取得結(jié)果,即RTTI。
typename
告訴編譯器一個(gè)嵌套的限定名(包含::)中的未知的標(biāo)識(shí)符是一個(gè)類(lèi)型。這只在模板中需要區(qū)分依賴(lài)名稱(chēng)時(shí)使用。
另一種用法是在模版聲明參數(shù)列表中表示模版類(lèi)型參數(shù),可被class代替。
using
有兩種基本用法:using聲明和using指示(using namespace ...)。
前者是聲明,引入命名空間或基類(lèi)作用域內(nèi)已經(jīng)被聲明的名稱(chēng)。后者引入命名空間內(nèi)所有的名稱(chēng)。
C++11新增了一類(lèi)用法,可以代替typename,同時(shí)可以配合template使用(typedef基于語(yǔ)法考慮未被允許加入這種用法)。
void
特殊的“空”類(lèi)型,指定函數(shù)無(wú)返回值或無(wú)參數(shù)(在參數(shù)列表中只能夠唯一地使用),用于表達(dá)式轉(zhuǎn)換為void類(lèi)型以丟棄計(jì)算值的必要(C++11加入了discarded-value-expression顯式地指出了這一點(diǎn)),或用于void*指針類(lèi)型。
try
try,C++中用于異常處理的組合。
總結(jié)
以上是生活随笔為你收集整理的C/C++关键字解析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。