C 學習筆記(7) C 語句

2021-08-29 13:57:21 字數 4299 閱讀 7627

c++程式是一組函式,而每個函式又是一組語句。c++有好多種語句型別,上篇筆記總結的表示式可以轉化為語句,通常被稱作表示式語句。除此之外,還有空語句(;),返回語句(return 0;),復合語句({}程式塊)等。以上又被統稱為簡單語句。相對於簡單語句,c++還有類似於c語言的特殊語句,條件語句、迴圈語句以及轉移語句。本篇筆記總結這些特殊語句的用法。

一、條件語句

1.if語句

if(boolean_expression)

如果布林表示式為true,則if語句內的**塊將被執行。如果布林表示式為 false,則if語句結束後的第一組**(閉括號後)將被執行。整個if語句被視為一條語句。

if的測試條件會被強制轉化為bool型別,這意味著0被轉換為false,一切非零值(包括負數)被轉化為正值。常見的編寫帶有返回值的函式時,用返回0判斷程式執行正常,返回負值代表錯誤**,在呼叫該函式時只要用if(function())即可判斷。

如果決策結果只有兩種,也即「非黑即白」,那麼可以引入if else語句。

if(boolean_expression)

else

如果布林表示式為true,則執行 if 塊內的**。如果布林表示式為false,則執行else塊內的**。

如果決策有兩個以上的選擇,那麼將引入if elseif else結構語句。

if(boolean_expression 1)

else if( boolean_expression 2)

else if( boolean_expression 3)

else

需要注意乙個if後可跟零個或乙個else,else必須在所有else if之後。乙個if後可跟零個或多個else if,else if必須在else之前。一旦某個else if匹配成功,其他的else if或else將不會被測試。另外在書寫if的條件表示式時,判別等於的情況最好寫作if(value==variable),這可以避免與賦值語句的混淆。另外,浮點數由於截斷誤差的存在,不要用於比較相等或不等,而要寫作相差是否在截斷誤差內的方式,如if(fabs(a-b)<1e-6);

2.switch語句

如果某種決策有五種以上選擇,當然可以用if else if else來實現五個分支。但c++提供了更好的大型分支計算語句switch。

switch語句的基本格式如下:

switch (表示式)

其中:表示式——條件表示式,用作判斷條件,取值為整型、字元型、布林型或列舉型。

常量表示式——由常量構成,取值型別與條件表示式相同。

語句序列——可以是乙個語句也可以是一組語句。

switch語句的執行流程如下:

(1) 求條件表示式的值,並在常量表示式中找到與之相等的分支作為執行入口;

(2) 順序執行該分支的語句序列,直到遇到

break

語句或開關語句的關括號「

}」為止;這意味著程式進入某一分支後,將依次執行之後的所有語句,程式不會在執行到下乙個case處自動停止,除非遇見了break;。但不意味著每個case後都要有break,因為順序執行的情況也是有的。比如書中這段適應大小寫字元輸入的情況:

(3) 當條件表示式的值與所有常量表示式的值均不相等時,若有default分支,則執行其語句序列,否則跳出switch語句,執行後續語句。

將兩種條件語句作比較,可以發現if語句可以對浮點數和範圍進行條件判斷,而switch只能對常量(整型),所以if 的應用比較廣泛。但如果同樣可以使用if語句和switch語句,如果分支大於3,通常要用switch語句。

二、迴圈語句

1. for迴圈

for迴圈允許您編寫乙個執行特定次數的迴圈的重複控制結構。

for ( init; condition; increment )

for迴圈的執行流程為:

init 會首先被執行,且只會執行一次。這一步允許您宣告並初始化任何迴圈控制變數。您也可以不在這裡寫任何語句,只要有乙個分號出現即可。

接下來,會判斷condition。如果為真,則執行迴圈主體。如果為假,則不執行迴圈主體,且控制流會跳轉到緊接著for迴圈的下一條語句(for迴圈整體是一條語句)。

在執行完for迴圈主體後,控制流會跳回上面的increment語句。該語句允許您更新迴圈控制變數。該語句可以留空,只要在條件後有乙個分號出現即可。

條件再次被判斷。如果為真,則執行迴圈,這個過程會不斷重複(迴圈主體,然後增加步值,再然後重新判斷條件)。在條件變為假時,for迴圈終止。

2.while迴圈

while迴圈是沒有初始化和更新部分的for 迴圈,它只有測試條件和迴圈體。只要給定的條件為真,while迴圈語句會重複執行乙個目標語句。

while(condition)

首先程式計算括號內的測試條件,如果為true則實執行迴圈體中的語句。知道測試條件為false為止。

通常,while的應用也要在while語句之前初始化乙個值,判斷條件也即判斷該值,在while迴圈體內對這個值進行更新。這樣的結果其實就是for迴圈的表達形式。所以,while迴圈被用在讀入檔案或輸入,以及死迴圈(while(1))的情況。

3.do…while迴圈

不像for和while迴圈,它們是在迴圈頭部測試迴圈條件。do...while迴圈是在迴圈的尾部檢查它的條件。因此for迴圈和while迴圈被稱作入口條件迴圈,而do…while是出口條件迴圈。

do...while迴圈與while迴圈類似,但do...while迴圈會確保至少執行一次迴圈。

dowhile( condition );

條件表示式出現在迴圈的尾部,所以迴圈中的statement(s)會在條件被測試之前至少執行一次。

如果條件為真,控制流會跳轉回上面的do,然後重新執行迴圈中的statement(s)。這個過程會不斷重複,直到給定條件變為假為止。

三.轉移語句

這裡的轉移語句是指break,continue以及goto語句。

1.break和continue語句

break和continue語句都可以使程式能夠跳過部分**。可以在switch語句和任何迴圈中應用break語句,可以使程式跳到switch或迴圈後面的語句執行。continue語句只用於迴圈中,讓程式跳過迴圈體中剩餘的**,並執行下一次迴圈。

注意:同樣:

2.goto語句

c++和c語言一樣也有goto語句。goto語句也成為無條件轉移語句,其基本形式如下 :

goto 語句標號

語句標號由乙個有效地識別符號和符號";"組成,其中,識別符號的命名規則與變數名稱相同,即由字母、數字和下劃線組成,且第乙個字元必須是字母或下劃線。執行goto語句後,程式就會跳轉到語句標號處,並執行其後的語句。

通常goto語句與if條件語句連用,但是goto語句在給程式帶來靈活性的同時,也會使得使程式結構層次不清,而且不易讀,所以要合理運用該語句。在c++primerplus中作者寫明在大多數情況下(或者有的人認為在任何情況下)都不應該用goto語句,而應該用結構化控制語句實現其功能。因為goto使得程式的控制流難以跟蹤,使程式難以理解和難以修改。任何使用 goto 語句的程式可以改寫成不需要使用 goto 語句的寫法。

但我個人覺得有一些場景可以嘗試使用goto語句,比如多層巢狀迴圈的推出:

for(...) 

}}stop:

cout << "error in program.\n";

消除goto會導致一些額外的測試被執行。乙個簡單的break語句在這裡不會起到作用,因為它只會使程式退出最內層迴圈。

另外,在一些複雜流程的函式退出,尤其是要清理記憶體的情況也可以用goto。

int mapiinit()

rc = waitforsingleobject(hlock,0);

if(rc == wait_object_0)

if(!m_coinitd)

m_coinitd = true;

}if(!m_mapiinitd)

m_mapiinitd = true;

}result = dt_ok;

done:

if (hlock)

closehandle(hlock);

}return result;

error:

result = dt_error;

goto done;

}

如果在函式入口處動態開闢了一些記憶體空間(動態陣列),可以在error處進行統一釋放。這就省去了每乙個判斷失敗的地方都釋放一遍的重複**。

C 學習筆記7 C 函式的公升級 上

1 常量與巨集回顧 c 中的const常量可以替代巨集引數定義 const int a 5 等價於 define a 5 巨集具有 那麼c 是否有方法避免呢?2 內聯函式 c 中推薦使用內聯函式代替巨集 片段 c 中inline關鍵字宣告內聯函式 inline int func int a,int ...

C語言學習筆記 7 C語言中的小數

小數是由整數和小數兩部分組成,由點號.隔開,如0.23 0.444 23.67 3.98等都是合法小數,屬於十進位制數。除此外,還有指數形式,如7.25103 0.035105 27.36 10 3等。任何小數都可以用指數形式來表示。在c語言中,小數的指數形式為 aen或aen解釋 a為尾數部分,是...

C 程式語言學習 7 C 命名空間

假設這樣一種情況,當乙個班上有兩個名叫 zara 的學生時,為了明確區分它們,我們在使用名字之外,不得不使用一些額外的資訊,比如他們的家庭住址,或者他們父母的名字等等。同樣的情況也出現在 c 應用程式中。例如,您可能會寫乙個名為 xyz 的函式,在另乙個可用的庫中也存在乙個相同的函式 xyz 這樣,...