EasyC++,C++ 中的 For 循環
大家好,我是梁唐。
這是EasyC++系列的第19篇,簡單聊聊C++當中的for循環。
想要追求更好閱讀體驗的同學,可以點擊文末的「閱讀原文」,訪問github倉庫。
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循環當中:
- // version1
- int i;
- for (i = 0; i < 100; i++) ret += i;
- // version2
- for (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循環。
不過除非必要,我們還是要盡量遵守代碼規范,不要省略條件,這樣代碼可讀性也會更好一些。