簡單控制結構
程式通常不限於指令的線性序列。 在其過程中,它可能會分支、重複程式碼或做出決策。 為此,C++ 提供了控制結構,用於指定我們的程式必須做什麼、何時以及在什麼情況下執行。
透過引入控制結構,我們將不得不引入一個新概念:
複合語句或
塊。 塊是一組用分號 (;) 分隔的語句,就像所有 C++ 語句一樣,但分組在一個用大括號括起來的塊中
{ }:
{ 語句1; 語句2; 語句3; }
我們將在本節中看到的大多數控制結構都需要一個通用語句作為其語法的一部分。 語句可以是簡單語句(以分號結尾的簡單指令)或複合語句(分組在一個塊中的多個指令),就像剛剛描述的那樣。 如果我們希望該語句是簡單語句,則不需要用大括號括起來(
{})。 但是,如果我們希望該語句是複合語句,則必須將其括在大括號之間(
{}),形成一個塊。
條件結構:if 和 else
要放回的字元的
if關鍵字用於僅在滿足條件時執行語句或塊。 它的形式是
if (條件) 語句
其中
條件是被評估的表示式。 如果此條件為真,
語句將被執行。 如果為假,則
語句將被忽略(不執行),程式在此條件結構之後繼續執行。
例如,以下程式碼片段列印
x 是 100只有當
x變數中儲存的值確實是
100:
1 2
|
if (x == 100)
cout << "x is 100";
|
如果希望在條件為真時執行多個語句,我們可以使用大括號指定一個塊
{ }:
1 2 3 4 5
|
if (x == 100)
{
cout << "x is ";
cout << x;
}
|
我們還可以指定如果條件不滿足時我們希望發生什麼,方法是使用關鍵字
else。它與
if的 C++ 等效檔案是
if (條件) 語句1 else 語句2
例如:
1 2 3 4
|
if (x == 100)
cout << "x is 100";
else
cout << "x is not 100";
|
一起使用,在螢幕上列印
x 是 100如果確實
x的值為
100,但如果沒有——並且只有在沒有的情況下——它會列印
x 不是 100.
要放回的字元的
if + else結構可以連線起來,以驗證一系列值。 以下示例顯示了它的使用,用於判斷當前儲存在
x中的值是正數、負數還是零
1 2 3 4 5 6
|
if (x > 0)
cout << "x is positive";
else if (x < 0)
cout << "x is negative";
else
cout << "x is 0";
|
請記住,如果希望執行多個語句,我們必須透過將它們括在大括號中將它們分組到一個塊中
{ }.
迭代結構(迴圈)
迴圈的目的是重複一個語句一定次數或在滿足條件時重複執行。
while 迴圈
它的格式是
while (表示式) 語句
它的功能很簡單,就是重複執行語句,只要表示式中設定的條件為真。
例如,我們將使用 while 迴圈制作一個倒計時程式
|
// custom countdown using while
#include <iostream>
using namespace std;
int main ()
{
int n;
cout << "Enter the starting number > ";
cin >> n;
while (n>0) {
cout << n << ", ";
--n;
}
cout << "FIRE!\n";
return 0;
}
|
Enter the starting number > 8
8, 7, 6, 5, 4, 3, 2, 1, FIRE! |
當程式啟動時,會提示使用者插入倒計時的起始數字。 然後
while迴圈開始,如果使用者輸入的值滿足條件
n>0(即
n大於零),則將執行並重復條件後面的塊,只要條件(
n>0)仍然為真。
可以根據以下指令碼(從 main 開始)解釋先前程式的整個過程
- 使用者為n
- 賦值。檢查 while 條件 (n>0)。 此時有兩種可能性
* 條件為真:執行語句(到第 3 步)
* 條件為假:忽略語句並在其後繼續(到第 5 步)
- 執行語句
cout << n << ", ";
--n;
(在螢幕上列印n的值,並將n減小1)
- 塊的結尾。 自動返回到步驟 2
- 在塊之後繼續程式:列印 FIRE! 並結束程式。
在建立 while 迴圈時,我們必須始終考慮到它必須在某個時刻結束,因此我們必須在塊內提供某種方法來強制條件在某個時刻變為假,否則迴圈將永遠迴圈下去。 在這種情況下,我們包含了
--n;,它將條件中正在評估的變數 (
n) 的值減 1 - 這最終會使條件 (
n>0) 在一定數量的迴圈迭代後變為假:更具體地說,當
n變成
0時,我們的 while 迴圈和倒計時結束。
當然,對於我們的計算機來說,這是一個非常簡單的操作,整個倒計時都會立即執行,數字之間沒有任何實際延遲。
do-while 迴圈
它的格式是
do 語句 while (條件);
它的功能與 while 迴圈完全相同,除了
條件在 do-while 迴圈中,是在語句執行之後而不是之前評估,從而至少執行一次
語句,即使
條件永遠無法滿足。 例如,以下示例程式會回顯您輸入的任何數字,直到您輸入
0.
|
// number echoer
#include <iostream>
using namespace std;
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 迴圈通常用於必須確定迴圈結束的條件
在迴圈語句本身內確定,例如在前面的情況中,塊內的使用者輸入用於確定迴圈是否必須結束。 事實上,如果您從未輸入值
0在前面的示例中,您可以永遠被提示輸入更多數字。
for 迴圈
它的格式是
for (初始化; 條件; 遞增) 語句;
它的主要功能是重複
語句while
條件保持為真,就像 while 迴圈一樣。 但此外,
,對於迴圈提供了特定的位置來包含
初始化語句和
遞增語句。 因此,此迴圈專門用於使用計數器執行重複操作,計數器在每次迭代時都會初始化和遞增。
它的工作方式如下
- 初始化被執行。 通常,它是計數器變數的初始值設定。 這僅執行一次。
- 條件被檢查。 如果為真,則迴圈繼續,否則迴圈結束並且語句被跳過(不執行)。
- 語句被執行。 與往常一樣,它可以是單個語句或括在大括號中的塊{ }.
- 最後,無論在遞增欄位中指定什麼,都會被執行,迴圈返回到步驟 2。
這是一個使用 for 迴圈進行倒計時的示例
|
// countdown using a for loop
#include <iostream>
using namespace std;
int main ()
{
for (int n=10; n>0; n--) {
cout << n << ", ";
}
cout << "FIRE!\n";
return 0;
}
|
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE! |
要放回的字元的
初始化和
遞增欄位是可選的。 它們可以保持為空,但在所有情況下,它們之間的分號必須書寫。 例如,我們可以寫
for (;n<10;)如果我們不想指定初始化和遞增;或者
for (;n<10;n++)如果我們想包含遞增欄位但沒有初始化(也許是因為變數已經在之前初始化了)。
可選地,使用逗號運算子 (
,) 我們可以指定多個表示式
,對於迴圈中包含的任何欄位,例如在
初始化中。 逗號運算子 (
,) 是表示式分隔符,它用於分隔多個表示式,而通常只期望一個表示式。 例如,假設我們想在迴圈中初始化多個變數
1 2 3 4
|
for ( n=0, i=100 ; n!=i ; n++, i-- )
{
// whatever here...
}
|
如果
n或
i在迴圈內未修改,則此迴圈將執行 50 次。
n以
0的值開始,而
i以
100開始,條件是
n!=i(即
n不等於
i)。 因為
n增加 1,而
i減少 1,迴圈條件將在第 50 個迴圈之後變為假,此時
n和
i將等於
50.
跳轉語句。
break 語句
使用
break我們可以離開迴圈,即使迴圈結束的條件沒有滿足。 它可用於結束無限迴圈,或強制其在自然結束之前結束。 例如,我們將停止倒計時,在自然結束之前(可能是因為發動機檢查失敗?)
|
// break loop example
#include <iostream>
using namespace std;
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語句使程式跳過當前迭代中迴圈的其餘部分,就好像已到達語句塊的末尾一樣,從而導致它跳轉到以下迭代的開始。 例如,我們將在倒計時中跳過數字 5
|
// continue loop example
#include <iostream>
using namespace std;
int main ()
{
for (int n=10; n>0; n--) {
if (n==5) continue;
cout << n << ", ";
}
cout << "FIRE!\n";
return 0;
}
|
10, 9, 8, 7, 6, 4, 3, 2, 1, FIRE! |
goto 語句
goto允許絕對跳轉到程式中的另一個點。 您應該謹慎使用此功能,因為它的執行會導致無條件跳轉,而忽略任何型別的巢狀限制。
目標點由標籤標識,然後該標籤用作 goto 語句的引數。 標籤由有效的識別符號後跟冒號 (:
:).
一般來說,除了那些低階程式設計愛好者可能找到的用途外,此指令在結構化或面向物件的程式設計中沒有具體的用途。 例如,這是我們使用
goto:
|
// goto loop example
#include <iostream>
using namespace std;
int main ()
{
int n=10;
loop:
cout << n << ", ";
n--;
if (n>0) goto loop;
cout << "FIRE!\n";
return 0;
}
|
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE! |
exit 函式
exit是一個在
cstdlib庫中定義的函式。
的目的
exit是使用特定的退出程式碼終止當前程式。 它的原型是
1
|
void exit (int exitcode);
|
要放回的字元的
exitcode被某些作業系統使用,並且可能被呼叫程式使用。 按照慣例,退出程式碼為
0意味著程式正常完成,任何其他值意味著發生了一些錯誤或意外結果。
選擇性結構:switch。
switch 語句的語法有點特殊。 它的目的是檢查表示式的幾個可能的常量值。 類似於我們在本節開頭使用幾個
if和
else if指令連線所做的事情。 它的形式如下
switch (expression)
{
case constant1:
group of statements 1;
break;
case constant2:
group of statements 2;
break;
.
.
.
default:
default group of statements
}
它的工作方式如下:switch 評估
表示式並檢查它是否等效於
常量1,如果是,它將執行
語句組 1直到找到
break語句。 當它找到這個
break語句時,程式跳轉到
switch選擇性結構的結尾。
如果表示式不等於
常量1,則將針對
常量2進行檢查。 如果它等於這個,它將執行
語句組 2直到找到 break 關鍵字,然後將跳轉到
switch選擇性結構的結尾。
的結尾。最後,如果
表示式的值與任何先前指定的常量都不匹配(您可以根據要檢查的值包括任意數量的
case標籤),程式將執行包含在
default標籤之後的語句(如果存在)(因為它是可選的)。
以下兩個程式碼片段具有相同的行為
switch 示例 | if-else 等效 |
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";
}
|
要放回的字元的
switch語句在 C++ 語言中有點特殊,因為它使用標籤而不是塊。 這迫使我們在我們想要為特定條件執行的語句組之後放置
break語句。 否則,其餘語句——包括那些對應於其他標籤的語句——也將被執行,直到到達
switch選擇性塊的末尾或到達
break語句。
例如,如果我們不在第一個 case 組之後包含
break語句,程式將不會自動跳轉到
switch選擇性塊的結尾,並且它將繼續執行其餘語句,直到它到達
break指令或
switch選擇性塊的結尾。 這使得沒有必要包含大括號
{ }圍繞每個 case 的語句,並且它也可以用於為表示式的不同可能值執行相同的指令塊。 例如
1 2 3 4 5 6 7 8 9
|
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 只能用於將表示式與常量進行比較。 因此,我們不能將變數作為標籤(例如
case n,其中
n是一個變數)或範圍 (
case (1..3)),因為它們不是有效的 C++ 常量。
如果您需要檢查範圍或非常量的值,請使用
if和
else if語句的連線。