C++ 控制结构和函数(一) —— 控制结构
一個(gè)程序的語句往往并不僅限于線性順序結(jié)構(gòu)。在程序的執(zhí)行過程中它可能被分成兩支執(zhí)行,可能重復(fù)某些語句,也可能根據(jù)一些判斷結(jié)果而執(zhí)行不同的語句。因此C++ 提供一些控制結(jié)構(gòu)語句 (control structures) 來實(shí)現(xiàn)這些執(zhí)行順序。
為了介紹程序的執(zhí)行順序,我們需要先介紹一個(gè)新概念:語句塊(block of instructions)。一個(gè)語句塊(A block of instructions) 是一組互相之間由分號(hào)semicolons (;) 分隔開但整體被花括號(hào)curly bracket signs: { and }括起來的語句。
本節(jié)中我們將看到的大多數(shù)控制結(jié)構(gòu)允許一個(gè)通用的statement做參數(shù),這個(gè)statement根據(jù)需要可以是一條語句,也可以是一組語句組成的語句塊。如果我們只需要一條語句做statement,它可以不被括在花括號(hào) ({}) 內(nèi)。但如果我們需要多條語句共同做statement,則必須把它們括在花括號(hào)內(nèi) ({}) 以組成一個(gè)語句塊。
條件結(jié)構(gòu)Conditional structure: if and else
條件結(jié)構(gòu)用來實(shí)現(xiàn)僅在某種條件滿足的情況下才執(zhí)行一條語句或一個(gè)語句塊。它的形式是:
if (condition) statement這里 condition 是一個(gè)將被計(jì)算的表達(dá)式(expression)。如果表達(dá)式值為真,即條件(condition)為true,statement 將被執(zhí)行。否則,statement 將被忽略(不被執(zhí)行),程序從整個(gè)條件結(jié)構(gòu)之后的下一條語句繼續(xù)執(zhí)行。
例如,以下程序段實(shí)現(xiàn)只有當(dāng)變量x存儲(chǔ)的值確實(shí)為100的時(shí)候才輸出"x is 100":
if (x == 100)cout << "x is 100";
如果我們需要在條件condition為真true的時(shí)候執(zhí)行一條以上的語句,我們可以花括號(hào){}將語句括起來組成一個(gè)語句塊:
if (x == 100){
cout << "x is ";
cout << x;
}
我們可以用關(guān)鍵字else 來指定當(dāng)條件不能被滿足時(shí)需要執(zhí)行的語句,它需要和if 一起使用,形式是:
if (condition) statement1 else statement2例如:
if (x == 100)cout << "x is 100";
else
cout << "x is not 100";
以上程序如果x的值為100,則在屏幕上打出x is 100,如果x不是100,而且也只有在x不是100的時(shí)候,屏幕上將打出x is not 100。
多個(gè)if + else 的結(jié)構(gòu)被連接起來使用來判斷數(shù)值的范圍。以下例子顯示了如何用它來判斷變量 x中當(dāng)前存儲(chǔ)的數(shù)值是正值,負(fù)值還是既不正也不負(fù),即等于0 。
if (x > 0)cout << "x is positive";
else if (x < 0)
cout << "x is negative";
else
cout << "x is 0";
記住當(dāng)我們需要執(zhí)行多條語句時(shí),必須使用花括號(hào){}將它們括起來以組成一個(gè)語句塊block of instructions。
重復(fù)結(jié)構(gòu) Iteration structures 或循環(huán)loops
循環(huán)Loops 的目的是重復(fù)執(zhí)行一組語句一定的次數(shù)或直到滿足某種條件。
while 循環(huán)
格式是:
while (表達(dá)式expression) 語句statement它的功能是當(dāng)expression 的值為真true時(shí)重復(fù)執(zhí)行statement。
例如,下面我們將用while循環(huán)來寫一個(gè)倒計(jì)數(shù)程序:
| // custom countdown using while #include <iostream.h> int main () { int n; cout << "Enter the starting number > "; cin >> n; while (n>0) { cout << n << ", "; --n; } cout << "FIRE!"; return 0; } | Enter the starting number > 8 8, 7, 6, 5, 4, 3, 2, 1, FIRE! |
程序開始時(shí)提示用戶輸入一個(gè)倒計(jì)數(shù)的初始值。然后while 循環(huán)開始,如果用戶輸入的數(shù)值滿足條件n>0 (即 n 比0 大),后面跟的語句塊將會(huì)被執(zhí)行一定的次數(shù),直到條件 (n>0) 不再滿足(變?yōu)閒alse)。
以上程序的所有處理過程可以用以下的描述來解釋:
從main開始:
- true: 執(zhí)行statement (到第3步)
- false: 跳過statement. 程序直接執(zhí)行第5步.
cout << n << ", ";
--n;
(將n 的值打印在屏幕上,然后將n 的值減1).
我們必須考慮到循環(huán)必須在某個(gè)點(diǎn)結(jié)束,因此在語句塊之內(nèi)(loop的statement之內(nèi)) 我們必須提供一些方法使得條件condition 可以在某個(gè)時(shí)刻變?yōu)榧?false,否則循環(huán)將無限重復(fù)下去。在這個(gè)例子里,我們用語句--n;使得循環(huán)在重復(fù)一定的次數(shù)后變?yōu)閒alse :當(dāng) n 變?yōu)?, 倒計(jì)數(shù)結(jié)束。
do-while 循環(huán)
格式:
do 語句statement while (條件condition);它的功能與while 循環(huán)一抹一樣,除了在do-while循環(huán)中是先執(zhí)行statement 然后才檢查條件condition ,而不想while循環(huán)中先檢查條件然后才執(zhí)行statement。這樣,即使條件condition從來沒有被滿足過,statement 仍至少被執(zhí)行一次。例如,下面的程序重復(fù)輸出(echoes)用戶輸入的任何數(shù)值,直到用戶輸入0為止。
| // number echoer #include <iostream.h> int main () { unsigned long n; do { cout << "Enter number (0 to end): "; cin >> n; cout << "You entered: " << n << "\n"; } while (n != 0); return 0; } | Enter number (0 to end): 12345 You entered: 12345 Enter number (0 to end): 160277 You entered: 160277 Enter number (0 to end): 0 You entered: 0 |
do-while?循環(huán)通常被用在判斷循環(huán)結(jié)束的條件是在循環(huán)語句內(nèi)部被決定的情況下,比如以上的例子,在循環(huán)的語句塊內(nèi)用戶的輸入決定了循環(huán)是否結(jié)束。如果用戶永遠(yuǎn)不輸入0,則循環(huán)永遠(yuǎn)不會(huì)結(jié)束。
for 循環(huán)
格式是:
for (initialization; condition; increase) statement;它的主要功能是當(dāng)條件condition 為真true時(shí)重復(fù)執(zhí)行語句statement ,類似while 循環(huán)。但除此之外,for 還提供了寫初始化語句initialization 和增值語句increase 的地方。因此這種循環(huán)結(jié)構(gòu)是特別為執(zhí)行由計(jì)數(shù)器控制的循環(huán)而設(shè)計(jì)的。
它按以下方式工作:
下面是用for循環(huán)實(shí)現(xiàn)的倒計(jì)數(shù)的例子:
| // countdown using a for loop #include <iostream.h> int main () { for (int n=10; n>0; n--) { cout << n << ", "; } cout << "FIRE!"; return 0; } | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE! |
初始化initialization 和增值increase 域是可選的(即可以為空)。但這些域?yàn)榭盏臅r(shí)候,它們和其他域之間間隔的分號(hào)不可以省略。例如我們可以寫:for (;n<10;)來表示沒有初始化和增值語句;或for (;n<10;n++) 來表示有增值語句但沒有初始化語句。
另外我們也可以在for循環(huán)初始化或增值域中放一條以上的語句,中間用逗號(hào) coma(,)隔開。例如假設(shè)我們想在循環(huán)中初始化一個(gè)以上的變量,可以用以下的程序來實(shí)現(xiàn):
for ( n=0, i=100 ; n!=i ; n++, i-- ){
// whatever here...
}
這個(gè)循環(huán)將被執(zhí)行50 次,如果n 和i 在循還內(nèi)部都不被改變的話:
n初始值為0,i初始值為100,條件是(n!=i)(即n不能等于i)。因?yàn)槊看窝h(huán)n加1,而且i減1,循環(huán)的條件將會(huì)在第50次循環(huán)之后變?yōu)榧?strong>false(n?和?i?都等于50)。
分支控制和跳轉(zhuǎn)(Bifurcation of control and jumps)
break 語句
通過使用break語句,即使在結(jié)束條件沒有滿足的情況下,我們也可以跳出一個(gè)循環(huán)。它可以被用來結(jié)束一個(gè)無限循環(huán)(infinite loop),或強(qiáng)迫循環(huán)在其自然結(jié)束之前結(jié)束。例如,我們想要在倒計(jì)數(shù)自然結(jié)束之前強(qiáng)迫它停止(也許因?yàn)橐粋€(gè)引擎故障):
| // break loop example #include <iostream.h> int main () { int n; for (n=10; n>0; n--) { cout << n << ", "; if (n==3) { cout << "countdown aborted!"; break; } return 0; } | 10, 9, 8, 7, 6, 5, 4, 3, countdown aborted! |
continue 語句
continue語句使得程序跳過當(dāng)前循環(huán)中剩下的部分而直接進(jìn)入下一次循環(huán),就好像循環(huán)中語句塊的結(jié)尾已經(jīng)到了使得循環(huán)進(jìn)入下一次重復(fù)。例如,下面例子中倒計(jì)數(shù)時(shí)我們將跳過數(shù)字5的輸出:
| // continue loop example #include <iostream.h> int main () { for (int n=10; n>0; n--) { if (n==5) continue; cout << n << ", "; } cout << "FIRE!"; return 0; } | 10, 9, 8, 7, 6, 4, 3, 2, 1, FIRE! |
goto 語句
通過使用goto語句可以使程序從一點(diǎn)跳轉(zhuǎn)到另外一點(diǎn)。你必須謹(jǐn)慎只用這條語句,因?yàn)樗膱?zhí)行可以忽略任何嵌套限制。
跳轉(zhuǎn)的目標(biāo)點(diǎn)可以由一個(gè)標(biāo)示符(label)來標(biāo)明,該標(biāo)示符作為goto語句的參數(shù)。一個(gè)標(biāo)示符(label)由一個(gè)標(biāo)識(shí)名稱后面跟一個(gè)冒號(hào)colon (:)組成。
通常除了底層程序愛好者使用這條語句,它在結(jié)構(gòu)化或面向?qū)ο蟮木幊讨胁⒉怀S?。下面的例子中我們用goto來實(shí)現(xiàn)倒計(jì)數(shù)循環(huán):
| // goto loop example #include <iostream.h> int main () { int n=10; loop: cout << n << ", "; n--; if (n>0) goto loop; cout << "FIRE!"; return 0; } | 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE! |
exit 函數(shù)
exit是一個(gè)在cstdlib (stdlib.h)庫中定義的函數(shù)。
exit的目的是一個(gè)特定的退出代碼來結(jié)束程序的運(yùn)行,它的原型(prototype)是:
void exit (int exit code);exit code是由操作系統(tǒng)使用或被調(diào)用程序使用。通常exit code為0表示程序正常結(jié)束,任何其他值表示程序執(zhí)行過程中出現(xiàn)了錯(cuò)誤。
選擇結(jié)構(gòu)The selective Structure: switch
switch?語句的語法比較特殊。它的目標(biāo)是對(duì)一個(gè)表達(dá)式檢查多個(gè)可能常量值,有些像我們?cè)诒竟?jié)開頭學(xué)習(xí)的把幾個(gè)if 和else if 語句連接起來的結(jié)構(gòu)。它的形式是:
switch (expression) {case constant1:
block of instructions 1
break;
case constant2:
block of instructions 2
break;
.
.
.
default:
default block of instructions
}
它按以下方式執(zhí)行:
switch 計(jì)算表達(dá)式expression 的值,并檢查它是否與第一個(gè)常量constant1相等,如果相等,程序執(zhí)行常量1后面的語句塊block of instructions 1 直到碰到關(guān)鍵字break ,程序跳轉(zhuǎn)到switch 選擇結(jié)構(gòu)的結(jié)尾處。
如果expression 不等于constant1,程序檢查表達(dá)式expression 的值是否等于第二個(gè)常量constant2, 如果相等,程序?qū)?zhí)行常量2后面的語句塊block of instructions 2 直到碰到關(guān)鍵字break。
依此類推,直到最后如果表達(dá)式expression 的值不等于任何前面的常量(你可以用case語句指明任意數(shù)量的常量值來要求檢查),程序?qū)?zhí)行默認(rèn)區(qū)default: 后面的語句,如果它存在的話。default: 選項(xiàng)是可以省略的。
下面的兩段代碼段功能相同:
| switch (x) { case 1: cout << "x is 1"; break; case 2: cout << "x is 2"; break; default: cout << "value of x unknown"; } | if (x == 1) { cout << "x is 1"; } else if (x == 2) { cout << "x is 2"; } else { cout << "value of x unknown"; } |
前面已經(jīng)提到switch的語法有點(diǎn)特殊。注意每個(gè)語句塊結(jié)尾包含的break語句。這是必須的,因?yàn)槿绻贿@樣做,例如在語句塊block of instructions 1 的結(jié)尾沒有break,程序執(zhí)行將不會(huì)跳轉(zhuǎn)到switch選擇的結(jié)尾處 (}) ,而是繼續(xù)執(zhí)行下面的語句塊,直到第一次遇到break語句或到switch選擇結(jié)構(gòu)的結(jié)尾。因此,不需要在每一個(gè)case 域內(nèi)加花括號(hào){ }?。這個(gè)特點(diǎn)同時(shí)可以幫助實(shí)現(xiàn)對(duì)不同的可能值執(zhí)行相同的語句塊。例如:
switch (x) {case 1:
case 2:
case 3:
cout << "x is 1, 2 or 3";
break;
default:
cout << "x is not 1, 2 nor 3";
}
注意switch只能被用來比較表達(dá)式和不同常量的值constants。因此我們不能夠把變量或范圍放在case之后,例如 (case (n*2):) 或 (case (1..3):) 都不可以,因?yàn)樗鼈儾皇怯行У某A俊?如果你需要檢查范圍或非常量數(shù)值,使用連續(xù)的if 和else if 語句。
總結(jié)
以上是生活随笔為你收集整理的C++ 控制结构和函数(一) —— 控制结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win7下JDK环境变量的设置
- 下一篇: s3c2440移植MQTT