C++程序設(shè)計(jì)從零開始之語(yǔ)句
發(fā)表時(shí)間:2024-02-17 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]前面已經(jīng)說(shuō)過(guò)程序就是方法的描述,而方法的描述無(wú)外乎就是動(dòng)作加動(dòng)作的賓語(yǔ),而這里的動(dòng)作在C++中就是通過(guò)語(yǔ)句來(lái)表現(xiàn)的,而動(dòng)作的賓語(yǔ),也就是能夠被操作的資源,但非?上У谻++語(yǔ)言本身只支持一種資源——內(nèi)存。由于電腦實(shí)際可以操作不止內(nèi)存這一種資源,導(dǎo)致C++語(yǔ)言實(shí)際并不能作為底層硬件程序的編寫語(yǔ)言(即...
前面已經(jīng)說(shuō)過(guò)程序就是方法的描述,而方法的描述無(wú)外乎就是動(dòng)作加動(dòng)作的賓語(yǔ),而這里的動(dòng)作在C++中就是通過(guò)語(yǔ)句來(lái)表現(xiàn)的,而動(dòng)作的賓語(yǔ),也就是能夠被操作的資源,但非?上У谻++語(yǔ)言本身只支持一種資源——內(nèi)存。由于電腦實(shí)際可以操作不止內(nèi)存這一種資源,導(dǎo)致C++語(yǔ)言實(shí)際并不能作為底層硬件程序的編寫語(yǔ)言(即使是C語(yǔ)言也不能),不過(guò)各編譯器廠商都提供了自己的嵌入式匯編語(yǔ)句功能(也可能沒(méi)提供或提供其它的附加語(yǔ)法以使得可以操作硬件),對(duì)于VC,通過(guò)使用__asm語(yǔ)句即可實(shí)現(xiàn)在C++代碼中加入?yún)R編代碼來(lái)操作其他類型的硬件資源。對(duì)于此語(yǔ)句,本系列不做說(shuō)明。
語(yǔ)句就是動(dòng)作,C++中共有兩種語(yǔ)句:?jiǎn)尉浜蛷?fù)合語(yǔ)句。復(fù)合語(yǔ)句是用一對(duì)大括號(hào)括起來(lái),以在需要的地方同時(shí)放入多條單句,如:{ long a = 10; a += 34; }。而單句都是以“;”結(jié)尾的,但也可能由于在末尾要插入單句的地方用復(fù)合語(yǔ)句代替了而用“}”結(jié)尾,如:if( a ) { a--; a++; }。應(yīng)注意大括號(hào)后就不用再寫“;”了,因?yàn)槠洳皇菃尉洹?
方法就是怎么做,而怎么做就是在什么樣的情況下以什么樣的順序做什么樣的動(dòng)作。因?yàn)镃++中能操作的資源只有內(nèi)存,故動(dòng)作也就很簡(jiǎn)單的只是關(guān)于內(nèi)存內(nèi)容的運(yùn)算和賦值取值等,也就是前面說(shuō)過(guò)的表達(dá)式。而對(duì)于“什么樣的順序”,C++強(qiáng)行規(guī)定只能從上朝下,從左朝右來(lái)執(zhí)行單句或復(fù)合語(yǔ)句(不要和前面關(guān)于表達(dá)式的計(jì)算順序搞混了,那只是在一個(gè)單句中的規(guī)則)。而最后對(duì)于“什么樣的情況”,即進(jìn)行條件的判斷。為了不同情況下能執(zhí)行不同的代碼,C++定義了跳轉(zhuǎn)語(yǔ)句來(lái)實(shí)現(xiàn),其是基于CPU的運(yùn)行規(guī)則來(lái)實(shí)現(xiàn)的,下面先來(lái)看CPU是如何執(zhí)行機(jī)器代碼的。
機(jī)器代碼的運(yùn)行方式
前面已經(jīng)說(shuō)過(guò),C++中的所有代碼到最后都要變成CPU能夠認(rèn)識(shí)的機(jī)器代碼,而機(jī)器代碼由于是方法的描述也就包含了動(dòng)作和動(dòng)作的賓語(yǔ)(也可能不帶賓語(yǔ)),即機(jī)器指令和內(nèi)存地址或其他硬件資源的標(biāo)識(shí),并且全部都是用二進(jìn)制數(shù)表示的。很正常,這些代表機(jī)器代碼的二進(jìn)制數(shù)出于效率的考慮在執(zhí)行時(shí)要放到內(nèi)存中(實(shí)際也可以放在硬盤或其他存儲(chǔ)設(shè)備中),則很正常地每個(gè)機(jī)器指令都能有一個(gè)地址和其相對(duì)應(yīng)。
CPU內(nèi)帶一種功能和內(nèi)存一樣的用于暫時(shí)記錄二進(jìn)制數(shù)的硬件,稱作寄存器,其讀取速度較內(nèi)存要快很多,但大小就小許多了。為了加快讀取速度,寄存器被去掉了尋址電路進(jìn)而一個(gè)寄存器只能存放1個(gè)32位的二進(jìn)制數(shù)(對(duì)于32位電腦)。而CPU就使用其中的一個(gè)寄存器來(lái)記錄當(dāng)前欲運(yùn)行的機(jī)器指令的位置,在此稱它為指令寄存器。
CPU運(yùn)行時(shí),就取出指令寄存器的值,進(jìn)而找到相應(yīng)的內(nèi)存,讀取1個(gè)字節(jié)的內(nèi)容,查看此8位二進(jìn)制數(shù)對(duì)應(yīng)的機(jī)器指令是什么,進(jìn)而做相應(yīng)的動(dòng)作。由于不同的指令可能有不同數(shù)量的參數(shù)(即前面說(shuō)的動(dòng)作的賓語(yǔ))需要,如乘法指令要兩個(gè)參數(shù)以將它們乘起來(lái),而取反操作只需要一個(gè)參數(shù)的參與。并且兩個(gè)8位二進(jìn)制數(shù)的乘法和兩個(gè)16位二進(jìn)制數(shù)的乘法也不相同,故不同的指令帶不同的參數(shù)而形成的機(jī)器代碼的長(zhǎng)度可能不同。每次CPU執(zhí)行完某條機(jī)器代碼后,就將指令寄存器的內(nèi)容加上此機(jī)器代碼的長(zhǎng)度以使指令寄存器指向下一條機(jī)器代碼,進(jìn)而重復(fù)上面的過(guò)程以實(shí)現(xiàn)程序的運(yùn)行(這只是簡(jiǎn)單地說(shuō)明,實(shí)際由于各種技術(shù)的加入,如高速緩沖等,實(shí)際的運(yùn)行過(guò)程要比這復(fù)雜得多)。
語(yǔ)句的分類
在C++中,語(yǔ)句總共有6種:聲明語(yǔ)句、定義語(yǔ)句、表達(dá)式語(yǔ)句、指令語(yǔ)句、預(yù)編譯語(yǔ)句和注釋語(yǔ)句。其中的聲明語(yǔ)句下篇說(shuō)明,預(yù)編譯語(yǔ)句將在《C++從零開始(十六)》中說(shuō)明,而定義語(yǔ)句就是前面已經(jīng)見(jiàn)過(guò)的定義變量,后面還將說(shuō)明定義函數(shù)、結(jié)構(gòu)等。表達(dá)式語(yǔ)句則就是一個(gè)表達(dá)式直接接一個(gè)“;”,如:34;、a = 34;等,以依靠操作符的計(jì)算功能的定義而生成相應(yīng)的關(guān)于內(nèi)存值操作的代碼。注釋語(yǔ)句就是用于注釋代碼的語(yǔ)句,即寫來(lái)給人看的,不是給編譯器看的。最后的指令語(yǔ)句就是含有下面所述關(guān)鍵字的語(yǔ)句,即它們的用處不是操作內(nèi)存,而是實(shí)現(xiàn)前面說(shuō)的“什么樣的情況”。
這里的聲明語(yǔ)句、預(yù)編譯語(yǔ)句和注釋語(yǔ)句都不會(huì)轉(zhuǎn)換成機(jī)器代碼,即這三種語(yǔ)句不是為了操作電腦,而是其他用途,以后將詳述。而定義語(yǔ)句也不一定會(huì)生成機(jī)器代碼,只有表達(dá)式語(yǔ)句和指令語(yǔ)句一定會(huì)生成代碼(不考慮編譯器的優(yōu)化功能)。
還應(yīng)注意可以寫空語(yǔ)句,即;或{},它們不會(huì)生成任何代碼,其作用僅僅只是為了保證語(yǔ)法上的正確,后面將看到這一點(diǎn)。下面說(shuō)明注釋語(yǔ)句和指令語(yǔ)句——跳轉(zhuǎn)語(yǔ)句、判斷語(yǔ)句和循環(huán)語(yǔ)句(實(shí)際不止這些,由于異常和模板技術(shù)的引入而增加了一些語(yǔ)句,將分別在說(shuō)明異常和模板時(shí)說(shuō)明)。
注釋語(yǔ)句——//、/**/
注釋,即用于解釋的標(biāo)注,即一些文字信息,用以向看源代碼的人解釋這段代碼什么意思,因?yàn)槿说恼J(rèn)知空間和電腦的完全不同,這在以后說(shuō)明如何編程時(shí)會(huì)具體討論。要書寫一段話用以注釋,用“/*”和“*/”將這段話括起來(lái),如下:
long a = 1;
a += 1; /* a放的是人的個(gè)數(shù),讓人的個(gè)數(shù)加一 */
b *= a; /* b放的是人均花費(fèi),得到總的花費(fèi) */
上面就分別針對(duì)a += 1;和b *= a;寫了兩條注釋語(yǔ)句以說(shuō)明各自的語(yǔ)義(因?yàn)橹灰獣?huì)C++都知道它們是一個(gè)變量的自增一和另一個(gè)變量的自乘a,但不知道意義)。上面的麻煩之處就是需要寫“/*”和“*/”,有點(diǎn)麻煩,故C++又提供了另一種注釋語(yǔ)句——“//”:
long a = 1;
a += 1; // a放的是人的個(gè)數(shù),讓人的個(gè)數(shù)加一
b *= a; // b放的是人均花費(fèi),得到總的花費(fèi)
上面和前面等效,其中的“//”表示從它開始,這一行后面的所有字符均看成注釋,編譯器將不予理會(huì),即:
long a = 1; a += 1; // a放的是人的個(gè)數(shù),讓人的個(gè)數(shù)加一 b *= a;
其中的b *= a;將不會(huì)被編譯,因?yàn)榍懊娴摹?/”已經(jīng)告訴編譯器,從“//”開始,這一行后面的所有字符均是注釋,故編譯器不會(huì)編譯b *= a;。但如果
long a = 1; a += 1; /* a放的是人的個(gè)數(shù),讓人的個(gè)數(shù)加一 */ b *= a;
這樣編譯器依舊會(huì)編譯b *= a;,因?yàn)椤?*”和“*/”括起來(lái)的才是注釋。
應(yīng)該注意注釋語(yǔ)句并不是語(yǔ)句,其不以“;”結(jié)束,其只是另一種語(yǔ)法以提供注釋功能,就好象以后將要說(shuō)明的預(yù)編譯語(yǔ)句一樣,都不是語(yǔ)句,都不以“;”結(jié)束,既不是單句也不是復(fù)合語(yǔ)句,只是出于習(xí)慣的原因依舊將它們稱作語(yǔ)句。
跳轉(zhuǎn)語(yǔ)句——goto
前面已經(jīng)說(shuō)明,源代碼(在此指用C++編寫的代碼)中的語(yǔ)句依次地轉(zhuǎn)變成用長(zhǎng)度不同的二進(jìn)制數(shù)表示的機(jī)器代碼,然后順序放在內(nèi)存中(這種說(shuō)法不準(zhǔn)確)。如下面這段代碼:
long a = 1; // 假設(shè)長(zhǎng)度為5字節(jié),地址為3000
a += 1; // 則其地址為3005,假設(shè)長(zhǎng)度為4字節(jié)
b *= a; // 則其地址為3009,假設(shè)長(zhǎng)度為6字節(jié)
上面的3000、3005和3009就表示上面3條語(yǔ)句在內(nèi)存中的位置,而所謂的跳轉(zhuǎn)語(yǔ)句,也就是將上面的3000、3005等語(yǔ)句的地址放到前面提過(guò)的指令寄存器中以使得CPU開始從給定的位置執(zhí)行以表現(xiàn)出執(zhí)行順序的改變。因此,就必須有一種手段來(lái)表現(xiàn)語(yǔ)句的地址,C++對(duì)此給出了標(biāo)號(hào)(Label)。
寫一標(biāo)識(shí)符,后接“:”即建立了一映射,將此標(biāo)識(shí)符和其所在位置的地址綁定了起來(lái),如下:
long a = 1; // 假設(shè)長(zhǎng)度為5字節(jié),地址為3000
P1:
a += 1; // 則其地址為3005,假設(shè)長(zhǎng)度為4字節(jié)
P2:
b *= a; // 則其地址為3009,假設(shè)長(zhǎng)度為6字節(jié)
goto P2;
上面的P1和P2就是標(biāo)號(hào),其值分別為3005和3009,而最后的goto就是跳轉(zhuǎn)語(yǔ)句,其格式為goto <標(biāo)號(hào)>;。此語(yǔ)句非常簡(jiǎn)單,先通過(guò)“:”定義了一個(gè)標(biāo)號(hào),然后在編寫goto時(shí)使用不同的標(biāo)號(hào)就能跳到不同的位置。
應(yīng)該注意上面故意讓P1和P2定義時(shí)獨(dú)占一行,其實(shí)也可以不用,即:
long a = 1; P1: a += 1; P2: b *= a; goto P2;
因此看起來(lái)“P1:”和“P2:”好象是單獨(dú)的一條定義語(yǔ)句,應(yīng)該注意,準(zhǔn)確地說(shuō)它們應(yīng)該是語(yǔ)句修飾符,作用是定義標(biāo)號(hào),并不是語(yǔ)句,即這樣是錯(cuò)誤的:
long a = 1; P1: { a += 1; P2: b *= a; P3: } goto P2;
上面的P3:將報(bào)錯(cuò),因?yàn)槠錄](méi)有修飾任何語(yǔ)句。還應(yīng)注意其中的P1仍然是3005,即“{}”僅僅只是其復(fù)合的作用,實(shí)際并不產(chǎn)生代碼進(jìn)而不影響語(yǔ)句的地址。
判斷語(yǔ)句——if else、switch
if else 前面說(shuō)過(guò)了,為了實(shí)現(xiàn)“什么樣的情況”做“什么樣的動(dòng)作”,故C++非常正常地提供了條件判斷語(yǔ)句以實(shí)現(xiàn)條件的不同而執(zhí)行不同的代碼。if else的格式為:
if(<數(shù)字>)<語(yǔ)句1>else<語(yǔ)句2> 或者 if(<數(shù)字>)<語(yǔ)句1>
long a = 0, b = 1;
P1:
a++;
b *= a;
if( a < 10 )
goto P1;
long c = b;
上面的代碼就表示只有當(dāng)a的值小于10時(shí),才跳轉(zhuǎn)到P1以重復(fù)執(zhí)行,最后的效果就是c的值為10的階乘。
上面的<數(shù)字>表示可以在“if”后的括號(hào)中放一數(shù)字,即表達(dá)式,而當(dāng)此數(shù)字的值非零時(shí),即邏輯真,程序跳轉(zhuǎn)以執(zhí)行<語(yǔ)句1>,如果為零,即邏輯假,則執(zhí)行<語(yǔ)句2>。即也可如此:if( a – 10 ) goto P1;,其表示當(dāng)a – 10不為零時(shí)才執(zhí)行g(shù)oto P1;。這和前面的效果一樣,雖然最后c仍然是10的階乘,但意義不同,代碼的可讀性下降,除非出于效率的考慮,不推薦如此書寫代碼。
而<語(yǔ)句1>和<語(yǔ)句2>由于是語(yǔ)句,也就可以放任何是語(yǔ)句的東西,因此也可以這樣:
if( a ) long c;
上面可謂吃飽了撐了,在此只是為了說(shuō)明<語(yǔ)句1>實(shí)際可以放任何是語(yǔ)句的東西,但由于前面已經(jīng)說(shuō)過(guò),標(biāo)號(hào)的定義以及注釋語(yǔ)句和預(yù)編譯語(yǔ)句其實(shí)都不是語(yǔ)句,因此下面試圖當(dāng)a非零時(shí),定義標(biāo)號(hào)P2和當(dāng)a為零時(shí)書寫注釋“錯(cuò)誤!”的意圖是錯(cuò)誤的:
if( a ) P2: 或者 if( !a ) // 錯(cuò)誤!
a++; a++;
但編譯器不會(huì)報(bào)錯(cuò),因?yàn)榍罢邔?shí)際是當(dāng)a非零時(shí),將a自增一;后者實(shí)際是當(dāng)a為零時(shí),將a自增一。還應(yīng)注意,由于復(fù)合語(yǔ)句也是語(yǔ)句,因此:
if( a ){ long c = 0; c++; }
由于使用了復(fù)合語(yǔ)句,因此這個(gè)判斷語(yǔ)句并不是以“;”結(jié)尾,但它依舊是一個(gè)單句,即:
if( a )
if( a < 10 ) { long c = 0; c++; }
else
b *= a;
上面雖然看起來(lái)很復(fù)雜,但依舊是一個(gè)單句,應(yīng)該注意當(dāng)寫了一個(gè)“else”時(shí),編譯器向上尋找最近的一個(gè)“if”以和其匹配,因此上面的“else”是和“if( a < 10 )”匹配的,而不是由于上面那樣的縮進(jìn)書寫而和“if( a )”匹配,因此b *= a;只有在a大于等于10的時(shí)候才執(zhí)行,而不是想象的a為零的時(shí)候。
還應(yīng)注意前面書寫的if( a ) long c;。這里的意思并不是如果a非零,就定義變量c,這里涉及到作用域的問(wèn)題,將在下篇說(shuō)明。
switch 這個(gè)語(yǔ)句的定義或多或少地是因?yàn)閷?shí)現(xiàn)的原因而不是和“if else”一樣由于邏輯的原因。先來(lái)看它的格式:switch(<整型數(shù)字>)<語(yǔ)句>。
上面的<整型數(shù)字>和if語(yǔ)句一樣,只要是一個(gè)數(shù)字就可以了,但不同地必須是整型數(shù)字(后面說(shuō)明原因)。然后其后的<語(yǔ)句>與前相同,只要是語(yǔ)句就可以。在<語(yǔ)句>中,應(yīng)該使用這樣的形式:case <整型常數(shù)1>:。它在它所對(duì)應(yīng)的位置定義了一個(gè)標(biāo)號(hào),即前面goto語(yǔ)句使用的東西,表示如果<整型數(shù)字>和<整型常數(shù)1>相等,程序就跳轉(zhuǎn)到“case <整型常數(shù)1>:”所標(biāo)識(shí)的位置,否則接著執(zhí)行后續(xù)的語(yǔ)句。
long a, b = 3;
switch( a + 3 )
case 2: case 3: a++;
b *= a;
上面就表示如果a + 3等于2或3,就跳到a++;的地址,進(jìn)而執(zhí)行a++,否則接著執(zhí)行后面的語(yǔ)句b *= a;。這看起來(lái)很荒謬,有什么用?一條語(yǔ)句當(dāng)然沒(méi)意義,為了能夠標(biāo)識(shí)多條語(yǔ)句,必須使用復(fù)合語(yǔ)句,即如下:
long a, b = 3;
switch( a + 3 )
{
b = 0;
case 2:
a++; // 假設(shè)地址為3003
case 3:
a--; // 假設(shè)地址為3004
break;
case 1:
a *= a; // 假設(shè)地址為3006
}
b *= a; // 假設(shè)地址為3010
應(yīng)該注意上面的“2:”、“3:”、“1:”在這里看著都是整型的數(shù)字,但實(shí)際應(yīng)該把它們理解為標(biāo)號(hào)。因此,上面檢查a + 3的值,如果等于1,就跳到“1:”標(biāo)識(shí)的地址,即3006;如果為2,則跳轉(zhuǎn)到3003的地方執(zhí)行代碼;如果為3,則跳到3004的位置繼續(xù)執(zhí)行。而上面的break;語(yǔ)句是特定的,其放在switch后接的語(yǔ)句中表示打斷,使程序跳轉(zhuǎn)到switch以后,對(duì)于上面就是3010以執(zhí)行b *= a;。即還可如此:
switch( a ) if( a ) break;
由于是跳到相應(yīng)位置,因此如果a為-1,則將執(zhí)行a++;,然后執(zhí)行a--;,再執(zhí)行break;而跳到3010地址處執(zhí)行b *= a;。并且,上面的b = 0;將永遠(yuǎn)不會(huì)被執(zhí)行。
switch表示的是針對(duì)某個(gè)變量的值,其不同的取值將導(dǎo)致執(zhí)行不同的語(yǔ)句,非常適合實(shí)現(xiàn)狀態(tài)的選擇。比如用1表示安全,2表示有點(diǎn)危險(xiǎn),3表示比較危險(xiǎn)而4表示非常危險(xiǎn),通過(guò)書寫一個(gè)switch語(yǔ)句就能根據(jù)某個(gè)怪物當(dāng)前的狀態(tài)來(lái)決定其應(yīng)該做“逃跑”還是“攻擊”或其他的行動(dòng)以實(shí)現(xiàn)游戲中的人工智能。那不是很奇怪嗎?上面的switch通過(guò)if語(yǔ)句也可以實(shí)現(xiàn),為什么要專門提供一個(gè)switch語(yǔ)句?如果只是為了簡(jiǎn)寫,那為什么不順便提供多一些類似這種邏輯方案的簡(jiǎn)寫,而僅僅只提供了一個(gè)分支選擇的簡(jiǎn)寫和后面將說(shuō)的循環(huán)的簡(jiǎn)寫?因?yàn)槠涫浅鲇谝环N優(yōu)化技術(shù)而提出的,就好象后面的循環(huán)語(yǔ)句一樣,它們對(duì)邏輯的貢獻(xiàn)都可以通過(guò)if語(yǔ)句來(lái)實(shí)現(xiàn)(畢竟邏輯就是判斷),而它們的提出一定程度都是基于某種優(yōu)化技術(shù),不過(guò)后面的循環(huán)語(yǔ)句簡(jiǎn)寫的成分要大一些。
我們給出一個(gè)數(shù)組,數(shù)組的每個(gè)元素都是4個(gè)字節(jié)大小,則對(duì)于上面的switch語(yǔ)句,如下:
unsigned long Addr[3]; Addr[0] = 3006; Addr[1] = 3003; Addr[2] = 3004;
而對(duì)于switch( a + 3 ),則使用類似的語(yǔ)句就可以代替:goto Addr[ a + 3 – 1 ];
上面就是switch的真面目,應(yīng)注意上面的goto的寫法是錯(cuò)誤的,這也正是為什么會(huì)有switch語(yǔ)句。編譯器為我們構(gòu)建一個(gè)存儲(chǔ)地址的數(shù)組,這個(gè)數(shù)組的每個(gè)元素都是一個(gè)地址,其表示的是某條語(yǔ)句的地址,這樣,通過(guò)不同的偏移即可實(shí)現(xiàn)跳轉(zhuǎn)到不同的位置以執(zhí)行不同的語(yǔ)句進(jìn)而表現(xiàn)出狀態(tài)的選擇。
現(xiàn)在應(yīng)該了解為什么上面必須是<整型數(shù)字>了,因?yàn)檫@些數(shù)字將用于數(shù)組的下標(biāo)或者是偏移,因此必須是整數(shù)。而<整型常數(shù)1>必須是常數(shù),因?yàn)槠溆删幾g時(shí)期告訴編譯器它現(xiàn)在所在位置應(yīng)放在地址數(shù)組的第幾個(gè)元素中。
了解了switch的實(shí)現(xiàn)后,以后在書寫switch時(shí),應(yīng)盡量將各case后接的整型常數(shù)或其倍數(shù)靠攏以減小需生成的數(shù)組的大小,而無(wú)需管常數(shù)的大小。即case 1000、case1001、case 1002和case 2、case 4、case 6都只用3個(gè)元素大小的數(shù)組,而case 0、case 100、case 101就需要102個(gè)元素大小的數(shù)組。應(yīng)該注意,現(xiàn)在的編譯器都很智能,當(dāng)發(fā)現(xiàn)如剛才的后者這種只有3個(gè)分支卻要102個(gè)元素大小的數(shù)組時(shí),編譯器是有可能使用重復(fù)的if語(yǔ)句來(lái)代替上面數(shù)組的生成。
switch還提供了一個(gè)關(guān)鍵字——default。如下:
long a, b = 3;
switch( a + 3 )
{
case 2:
a++;
break;
case 3:
a += 3;
break;
default:
a--;
}
b *= a;
上面的“default:”表示當(dāng)a + 3不為2且不為3時(shí),則執(zhí)行a--;,即default表示缺省的狀況,但也可以沒(méi)有,則將直接執(zhí)行switch后的語(yǔ)句,因此這是可以的:switch( a ){}或switch( a );,只不過(guò)毫無(wú)意義罷了。