EasyC++19,C++中的for迴圈

大家好,我是梁唐。

這是EasyC++系列的第19篇,簡單聊聊C++當中的for迴圈用法。

想要追求更好閱讀體驗的同學,可以訪問github倉庫:EasyLeetCode。

for 迴圈

在程式設計當中我們經常會遇到需要重複執行的步驟,想要讓計算機能夠重複執行某些邏輯,就需要使用迴圈。

在C++當中,迴圈有三種類型,分別是

for

迴圈、

while

迴圈和

do while

迴圈。其中前兩者使用較多,最後一個很少使用。

基礎用法

求1 + 2 + 3 + 。。。 + 100的和,使用for迴圈實現:

int ret = 0;int i;for (i = 1; i <= 100; i++) { ret += i;}

這裡的

i++

表示自增操作,是

i+=1

的簡寫,也可以寫成

++i

。不過

++i

i++

並不能完全混用,我們將會在之後的內容當中進行闡述。

根據C++ Primer當中的定義,

for

迴圈可以分成三個部分。第一個部分是初始化,在這個

for

迴圈當中,我們把迴圈因子i初始化成了1。第二個部分是判斷條件,也就是

for

迴圈的執行條件,在什麼情況下需要執行迴圈。第三個部分是更新迴圈因子,比如在這個例子當中,我們當前的i加入了ret之後,自增1變成了下一個將要累加的數。最後一個部分就是花括號當中的執行體,也就是每次迴圈需要執行的內容。

寫成通用形式就是:

for (initialization; test-expression; update-expression) { body;}

初始化、判斷條件以及更新因子這三個部分使用分號分隔。如果迴圈要執行的內容只包含一條語句,花括號也可以不寫。不過為了保證全域性的程式碼風格統一,最好還是統一使用花括號。

test-expression

決定迴圈是否結束,因此,在每一次body開始執行之前,都需要進行一次

test-expression

的判斷。當

test-expression

為true時,才會執行body中的語句。

test-expression

並不一定需要是一個

bool

值,C++會進行強制轉換。比如對於int型別,0值會被轉換為false,而其他值都會轉換成true。如:

int ret = 0;int i;for (i = 100; i; i——) { ret += i;}

這段邏輯和上面一樣,同樣是計算了1到100累加的值。只不過這裡我們進行的是倒序相加,迴圈的執行條件為

i >= 0

。當i=0時結束,我們的判斷條件可以寫成i。

int

型的i會被強制轉換成

bool

型,當i=0時,值為false,迴圈結束。其中自減符的用法和自增類似。

進階用法

首先,我們可以將迴圈因子的宣告寫入for迴圈當中:

// version1int i;for (i = 0; i < 100; i++) ret += i;// version2for (int i = 0; i < 100; i++) ret += i;

這樣有兩個好處,第一是簡化了程式碼,將i的宣告語句寫入了

for

迴圈當中,可讀性也更好。另一點是限定了i這個變數的使用範圍,在for迴圈當中宣告的變數,

它的作用域也只有for迴圈

,出了迴圈之後,i這個變數將消失。

不過在一些老舊的編譯器(如VC6。0)當中並不會這樣,迴圈當中宣告的變數依然會繼續存在。

另外

initialization; test-expression; update-expression

這三條語句都不是必須的,可以根據我們的需要進行省略。

比如for迴圈所需要的初始化工作之前已經完成,那麼就可以省略

initialization

int i = 0;for (; i < 100; i++) ret += i;

比如我們也可以將迴圈的結束條件放在for迴圈的body當中,如:

for (int i = 0;; i++) { if (i > 100) break; ret += i;}

我們的更新條件同樣也可以放在body中:

for (int i = 0; i < 100;) { ret += i; i++;}

甚至,我們可以極端一點,三個條件都省略:

int i = 0;for (;;) { if (i > 100) break; ret += i; i++;}

同樣,我們更新的條件也不一定只能自增或自減,其他的任何邏輯也都可以。正因此,C++當中的

for

迴圈是非常靈活的, 使用得當完全可以代替

while

迴圈和

do while

迴圈。

不過除非必要,我們還是要儘量遵守程式碼規範,不要省略條件,這樣程式碼可讀性也會更好一些。