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
迴圈。
不過除非必要,我們還是要儘量遵守程式碼規範,不要省略條件,這樣程式碼可讀性也會更好一些。