官术网_书友最值得收藏!

1.4 基本語句

C++融入了C語言的面向過程的結構化程序設計模式,因而它也可實現結構化程序設計中所需要的三種基本結構:順序結構、選擇結構和循環結構。

1.4.1 順序語句和塊

語句是描述程序操作的基本單位,是C++源程序的重要組成部分,每條語句均以分號(“;”)來結束,分號前面可以有0個或多個空格。 這里先討論說明語句、表達式語句和塊語句,它們是構成按書寫順序依次執行的順序結構的主要語句。

1.說明語句

在C++中,把完成對數據結構的定義和描述、對變量或標識符常量的屬性說明(如初值、類型等)稱為說明語句聲明語句。說明語句的目的是用來在程序中引入一個新的標識符(變量名、函數名、數組名、類名、對象名、引用名及類型名等),本身一般不執行操作。

2.表達式語句

表達式語句是C++程序中最簡單也是最常用的語句。任何一個表達式加上分號就是一個表達式語句,例如:

x + y;
nNum = 5;

這里的“x+y;”是一個由算術運算符“+”構成的表達式語句,其作用是完成“x+y”的操作,但由于不保留計算結果,所以無實際意義?!皀Num=5;”是一個由賦值運算符“=”構成的表達式語句,簡稱為賦值語句,其作用是改變nNum變量的值。

在書寫格式上,可以將幾個簡單的表達式語句同時寫在一行上,但此時的語句之間必須插入一些空格以提高程序的可讀性。例如:

a=1;   b=2;   c=a+b;

此時3個賦值語句寫在一行,各條語句之間需要增加空格。

如果表達式是一個空表達式,那么構成的語句稱為空語句,也就是說,僅有分號也能構成一個語句,這個語句就是空語句。空語句不執行任何動作,根據語法的需要而設置。

3.塊語句

塊語句,簡稱為塊(block),是由一對花括號“{ }”括起來的語句,又稱為復合語句。例如:

{                                       // 塊開始
    int  i=2,j=3,k=4;
    cout<<i<<j<<k<<endl;                // 輸出結果是2、3和4
}                                       // 塊結束

則是由兩條語句構成的塊語句。其中,左花括號“{”表示塊的開始,右花括號“}”表示塊的結束,它們是成對出現的。要注意,塊中的語句書寫時一定要縮進。

事實上,任何合法的語句都可以出現在塊中,包括空語句。需要說明的是:

(1)從整體上看,塊語句等效于一條語句。反過來說,若需要將兩條或兩條以上的語句作為一個整體單條語句時,則必須將它們用花括號括起來。

(2)塊中的語句可以是0個、1個或多個。與空語句相類似,一個不含任何語句的塊,即僅由一對花括號構成的塊,稱為空塊,它也是僅為語法的需要而設置的,并不執行任何動作。

1.4.2 選擇結構語句

選擇結構是對給定條件進行判斷,根據判斷的結果(真或假)來決定執行兩個分支或多個分支程序段中的一個分支。在C++中,用于構成選擇結構的分支語句有if語句和switch語句,它們又稱條件語句

1.條件語句

條件語句if具有下列一般形式:

if  (<表達式e>)<語句s1>
[ else <語句s2> ]

這里的if和else是C++的關鍵字。注意,if后的一對圓括號不能省略。當表達式e為true或不為0時,將執行語句s1。當表達式e為false或0時,語句s2被執行。其中,else可以省略,即變成這樣的簡單的if語句:

if  (<表達式e>)<語句s>

這樣,只有當表達式e為true或不為0時,語句s才被執行。

【例Ex_Compare】 輸入兩個整數,比較兩者的大小

#include <iostream.h>
int  main()
{
    int nNum1, nNum2;
    cout<< "Please input two integer numbers: ";
    cin>>nNum1>>nNum2;
    if (nNum1!=nNum2)
        if (nNum1>nNum2)
            cout<<nNum1<< " > "<<nNum2<<endl;
        else
            cout<<nNum1<< " < "<<nNum2<<endl;
    else
        cout<<nNum1<< " = "<<nNum2<<endl;
    return 0;
}

程序運行結果如下:

Please input two integer numbers: 10 123?

10 < 123

需要注意的是:

(1)條件語句中的表達式一般為邏輯表達式或關系表達式,如程序中的nNum1> nNum2。當然,表達式的類型也可以是任意的數值類型(包括整型、實型、字符型等)。例如:

if  (3)   cout<<"This is a number 3";

執行結果是輸出"This is a number 3";因為3是一個不為0的數,條件總為“真”。

(2)適當添加花括號“{ }”來增加程序的可讀性。例如:上面【例Ex_Compare】中的條件語句還可寫成下列形式,其結果是一樣的。

if (nNum1!=nNum2)
{
    if (nNum1>nNum2)
        cout<<nNum1<<" > "<<nNum2<<endl;
    else
        cout<<nNum1<<" < "<<nNum2<<endl;
} else
    cout<<nNum1<<" = "<<nNum2<<endl;

(3)如果在if和esle后有多條語句(復合語句),則必須用花括號將這些語句括起來,否則只有后面的第一條語句有效。例如:

if (nNum1>nNum2)
    cout<<nNum1<<">"<<nNum2;       // 此句是if后面的有效語句
    cout<<endl;                    // 此句無論if表達式是否為真都會執行

(4)條件語句中的語句s、語句s1和語句s2也可以是if條件語句,這就形成了if語句的嵌套。例如,程序中if (nNum1!=nNum2)后面的語句也是一個if條件語句。

(5)else不能單獨使用,它總是和其前面最近的未配套的if相配套。例如,程序中的第1個else屬于第2個if,而第2個else是屬于第1個if的。

2.開關語句

當程序有多個判斷條件時,若使用if語句則可能使嵌套太多,降低程序的可讀性。開關語句switch能很好地解決這種問題,它具有下列形式:

switch  (<表達式e>)
{
    case  <常量表達式v1>   :[語句s1]
    case  <常量表達式v2>   :[語句s2]
    ...
    case  <常量表達式vn>   :[語句sn]
    [default               :語句sn+1]
}

其中switch、case、default都是關鍵字,當表達式e的值與case中某個常量表達式的值相等時,就執行該case中冒號“:”后面的所有語句,直至遇到break語句跳出。若case中所有常量表達式的值都不等于表達式e的值,則執行“default:”后面的語句,若default省略,則跳出switch結構。需要注意的是,switch后面的表達式e可以是整型、字符型或枚舉型的表達式,而case后面的常量表達式的類型則必須與其相匹配。

例Ex_Switch】 根據成績的等級輸出相應的分數段

#include <iostream.h>
int  main()
{
    char chGrade;
    cout<<"Please input a char(A~E): ";
    cin>>chGrade;
    switch(chGrade)
    {
        case 'A':
        case'a':   cout<<"90--100"<<endl;
                break;
        case 'B':
        case'b':   cout<<"80--89"<<endl;
                break;
        case 'C':
        case'c':   cout<<"70--79"<<endl;
        case 'D':
        case'd':   cout<<"60--69"<<endl;
        case 'E':
        case'e':   cout<<"<60"<<endl;
        default:   cout<<"error!"<<endl;
    }
    return 0;
}

運行時,當用戶輸入A時,則運行結果如下:

Please input a char(A~E): A?

90--100

但當用戶輸入d時,則運行結果如下:

Please input a char(A~E): d?

60--69

< 60

error!

顯然,這不是想要的結果,而應該只輸出60--69。仔細比較這兩個結果可以發現,“case 'a':”后面含有break語句,而“case 'd':”后面則沒有。由于break語句能使系統跳出switch結構,因此當系統執行“case 'a':”后面的語句“cout<<"90--100"<<endl;”后,break語句使其跳出switch結構,以保證結果的正確性;若沒有break語句,則后面的語句繼續執行,直到遇到下一個break語句或switch結構的最后一個花括號“}”為止才跳出該結構。因此,break語句對switch結構有時是不可缺少的(后面還會專門討論)。

另外,還需注意的是:

(1)多個case可以共有一組執行語句,如程序中的:

case 'B':
case'b':   cout<<"80--89"<<endl;
           break;

這時,當用戶輸入B或b時將得到相同的結果。

(2)若同一個case后面的語句是復合語句,即有兩條或兩條以上的語句,則這些語句可以不用花括號“{ }”括起來。

(3)由于case語句起標號作用,因此每一個case常量表達式的值必須互不相同,否則會出現編譯錯誤。

1.4.3 循環結構語句

構成循環結構的循環語句提供了重復操作的能力,當指定的循環條件為true時,循環體中的語句就會被重復執行,并且每循環一次,就會測試一下循環條件,如果為false,則循環結束,否則繼續循環。C++為循環結構提供了三種形式的循環語句:while、do…while和for語句。這些循環語句的功能是相似的,在許多情況下它們可以相互替換,唯一區別是它們控制循環的方式。

1.while語句

語句具有下列格式:

while(<表達式e>)  <語句s>

其中,while是C++的關鍵字,語句s是循環體,它可以是一條語句,也可以是多條語句。當為多條語句時,一定要用花括號“{ }”括起來,使之成為塊語句,如果不加花括號,則while的循環體s只是緊跟while (e)后面的第1條語句。當表達式e為true或不為0時便開始執行while循環體中的語句s,然后反復執行,每次執行都會判斷表達式e是否為true或不為0,若為false或為0,則終止循環。

例Ex_SumWhile】 求整數1~50的和

#include <iostream.h>
int  main()
{
    int  nNum=1,  nTotal=0;
    while (nNum<=50)
    {
        nTotal += nNum;
        nNum++;
    }
    cout<<"The sum from 1 to 50 is: "<<nTotal<<"\n";
    return 0;
}

程序運行結果如下:

The sum from 1 to 50 is: 1275

需要說明的是,對于循環結構來說,循環體中一定要有使循環趨向結束的語句。比如上述示例中,nNum的初值為1,循環結束的條件是不滿足nNum<=50,隨著每次循環都改變nNum的值,使得nNum的值也越來越大,直到nNum>50為止。如果沒有循環體中的“nNum++;”,則nNum的值始終不改變,循環永不終止。

2.do…while語句

語句具有下列格式:

do
    <語句s>
while (<表達式e>) ;

其中do和while都是C++關鍵字,語句s是循環體,它可以是一條語句,也可以是塊語句。程序從do開始執行,然后執行循環體語句s,當執行到while時,將判斷表達式e是否為true,若是,則繼續執行循環體語句s,直到下一次表達式e等于false為止。要注意,while后面的表達式e兩邊的圓括號不能省略,且表達式e后面的分號不能漏掉。

例Ex_SumDoWhile】 求整數1~50的和

#include <iostream.h>
int  main()
{
    int   nNum=1,  nTotal=0;
    do
    {
        nTotal+=nNum;    nNum++;
    } while (nNum<=50);
    cout<<"The sum from 1 to 50 is: "<<nTotal<<"\n";
    return 0;
}

由于程序總是自上而下地順序運行(除非遇到if、while等流程控制語句),因此do語句中的循環會先執行,這樣sum值為1,i為2。然后判斷while后面的“(i<=50)”是否為true,若是,則流程轉到do循環體中,直到“(i<=50)”為false。

程序運行結果如下:

The sum from 1 to 50 is: 1275

從上述例子中可以看出:

(1)do…while循環語句至少執行一次循環體,而while循環語句可能一次都不執行。

(2)從局部來看,while和do…while循環都有“while (表達式e)”。為區別起見,對于do…while循環來說,無論循環體是單條語句還是多條語句,習慣上都要用花括號將它們括起來,并將“while (表達式e);”直接寫在右花括號“}”的后面,如【例Ex_SumDoWhile】中的格式。

3.for語句

語句具有下列格式:

for ([表達式e1]; [表達式e2]; [表達式e3])
    <語句s>

其中for是C++的關鍵字,語句s是循環體,它可以是一條語句,也可以是塊語句。一般情況下,表達式e1用做循環變量的初始化,表達式e2用做循環體的循環條件,當其為true時,開始執行循環體語句s,然后計算表達式e3,再判斷表達式e2的值是否為true,若是,再執行循環體s,再計算表達式e3,如此反復,直到表達式e2為false或0為止。如圖1.7所示,圖中箭頭表示程序運行的方向,稱為流向,程序運行的次序稱為流程,這樣的圖稱為流程圖。下面用for語句來改寫【例Ex_SumDoWhile】中的代碼。

圖1.7 for語句的流程

例Ex_SumFor】 求整數1~50的和

#include <iostream.h>
int  main()
{
    int  nTotal=0;
    for (int nNum=1; nNum<=50; nNum++)
        nTotal += nNum;
    cout<<"The sum from 1 to 50 is: "<<nTotal<<"\n";
    return 0;
}

程序運行結果如下:

The sum from 1 to 50 is: 1275

需要說明的是:

(1)由于表達式e1用做循環變量的初始化,因此也可將循環變量的定義放在表達式e1中進行,如代碼中for語句的“int nNum=1”。但此時nNum的作用范圍僅限于for循環結構中,這是ANSI/ISO C++中的新規定。但在Visual C++ 6.0中,nNum的作用范圍和在for前面定義的變量(如nTotal)的作用范圍是一樣的。

(2)表達式e1、表達式e2和表達式e3可以是一個簡單的表達式,也可以是逗號表達式,即包含兩個或兩個以上的簡單表達式,中間用逗號分隔。例如:

for(nNum=1,nTotal=0;nNum<=50;nNum++)   nTotal+=nNum;

(3)循環體s中的語句也可以是一條空語句,這樣的循環往往用于時間延時。例如:

for(int i=0;i<10000;i++) ;        // 注意后面的分號表示一條空語句

(4)實際運用時,for循環還有許多變化的形式,這些形式都是將for后面括號中的表達式e1、表達式e2、表達式e3進行部分或全部省略,但要注意起分隔作用的分號“;”不能省略。常見的省略形式有下列幾種:

① 若省略表達式e1,不影響循環體的正確執行,但循環體中所需要的一些變量及其相關的數值要在for語句之前定義。例如:

int  nNum=1;
for(;nNum<=50;nNum++)    nTotal+=nNum;

② 若省略表達式e2,則默認的表達式e2的值被認為true,循環無終止地進行下去,應在循環體中添加額外代碼使之有跳出或終止循環的可能。例如:

for(int nNum=1;  ;nNum++)
{
    nTotal += nNum;
    if  (nNum>50)break;         // 當nNum>50時,執行break語句,跳出循環
}

③ 若省略表達式e3,應在設計循環結構時保證表達式e2的值有等于false的可能,以便能終止循環。例如:

for (int nNum=1; nNum<=50 ;)
{
    nTotal+=nNum;    nNum++;
}

④ 若省略表達式e1和表達式e3,則相當于while循環。例如:

⑤ 若表達式全部省略,例如:

int  nNum=1;
for ( ; ; )
{
    nTotal+=nNum;    nNum++;
    if (nNum>50) break;
}

則循環體中所需要的一些變量及其相關的數值要在for語句之前定義,如“int nNum = 1;”,且應在循環體中添加額外代碼使之有跳出或終止循環的可能,如“if (nNum>50) break;”。

(5)由于循環體可由任何類型的語句組成,因此在循環體內還可以包含前面幾種循環語句,這樣就形成了循環的嵌套。例如:

for(…; …; …)
{
    while (…)
    {
    }
}
while (…)
{
    for(…; …; …)
    {
    }
}

以上是C++幾種類型的循環語句,使用時可根據實際需要進行適當選擇。但不管是怎樣的循環結構,在編程時應保證循環有終止的可能。否則,循環永不結束,就像“死機”一樣。

1.4.4 break和continue語句

在C++程序中,若需要跳出循環結構或提前結束本次循環,就需要使用break和continue語句,其格式如下:

break;
continue;

break語句用于強制結束switch結構(如【例Ex_Switch】)或從一個循環體跳出,即提前終止循環。要注意,break僅使流程跳出其所在的最近的那一層循環或switch結構,而不是跳出所有層的循環或switch結構。

continue適用于那些依靠條件判斷而進行循環的循環語句,如for、while、do…while語句,它的目的是提前結束本次循環。對于while和do…while語句來說,continue提前結束本次循環后,流程轉到while后面的表達式e。對于for語句來說,continue提前結束本次循環后,其流程轉到for語句的表達式e3,然后轉到表達式e2。

例Ex_Continue】 將1~100之間不能被7整除的數輸出

#include <iostream.h>
int  main()
{
    for (int nNum=1; nNum<=100; nNum++)
    {
        if (nNum%7 == 0) continue;
        cout<<nNum<<"  ";
    }
    cout<<"\n";
    return 0;
}

當nNum能被7整除時,執行continue語句,流程轉到for語句中的nNum++,并根據表達式nNum<=100的值來決定是否再做循環。而當nNum不能被7整除時,才執行cout<<nNum<<""語句。

程序運行結果如下:

1 2 3 4 5 6 8 9 10 11 12 13 15 16 17 18 19 20 22 23 24 25 26 27 29 30 31 32 33 34 36 37 38 39 40 41 43 44 45 46 47 48 50 51 52 53 54 55 57 58 59 60 61 62 64 65 66 67 68 69 71 72 73 74 75 76 78 79 80 81 82 83 85 86 87 88 89 90 92 93 94 95 96 97 99 100

主站蜘蛛池模板: 江阴市| 云浮市| 高陵县| 桐柏县| 盈江县| 定西市| 晋州市| 宜兰县| 兴隆县| 迭部县| 遂宁市| 黄梅县| 太仆寺旗| 玉门市| 阆中市| 河池市| 兴和县| 开远市| 莆田市| 西藏| 丽水市| 买车| 连州市| 辽宁省| 呈贡县| 驻马店市| 崇礼县| 龙胜| 黄山市| 万山特区| 济南市| 商城县| 柞水县| 阿拉善左旗| 中卫市| 滦平县| 麦盖提县| 嘉禾县| 图木舒克市| 青河县| 昌吉市|