- Visual C++實用教程
- 鄭阿奇編著
- 2145字
- 2018-12-30 12:04:27
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
- 程序員面試算法寶典
- JavaScript+jQuery開發實戰
- x86匯編語言:從實模式到保護模式(第2版)
- Java Web基礎與實例教程
- 名師講壇:Java微服務架構實戰(SpringBoot+SpringCloud+Docker+RabbitMQ)
- Mastering KnockoutJS
- Java:High-Performance Apps with Java 9
- Getting Started with Eclipse Juno
- Learning Continuous Integration with TeamCity
- Extreme C
- Hands-On Kubernetes on Windows
- Maven for Eclipse
- Implementing Microsoft Dynamics NAV(Third Edition)
- 你好!Python
- Internet of Things with Arduino Cookbook