EasyC++,C++ 中的 For 循環(huán)
大家好,我是梁唐。
這是EasyC++系列的第19篇,簡單聊聊C++當中的for循環(huán)。
想要追求更好閱讀體驗的同學,可以點擊文末的「閱讀原文」,訪問github倉庫。
for 循環(huán)
在編程當中我們經(jīng)常會遇到需要重復執(zhí)行的步驟,想要讓計算機能夠重復執(zhí)行某些邏輯,就需要使用循環(huán)。
在C++當中,循環(huán)有三種類型,分別是for循環(huán)、while循環(huán)和do while循環(huán)。其中前兩者使用較多,最后一個很少使用。
基礎用法
求1 + 2 + 3 + ... + 100的和,使用for循環(huán)實現(xiàn):
- int ret = 0;
- int i;
- for (i = 1; i <= 100; i++) {
- ret += i;
- }
這里的i++表示自增操作,是i+=1的簡寫,也可以寫成++i。不過++i和i++并不能完全混用,我們將會在之后的內(nèi)容當中進行闡述。
根據(jù)C++ Primer當中的定義,for循環(huán)可以分成三個部分。第一個部分是初始化,在這個for循環(huán)當中,我們把循環(huán)因子i初始化成了1。第二個部分是判斷條件,也就是for循環(huán)的執(zhí)行條件,在什么情況下需要執(zhí)行循環(huán)。第三個部分是更新循環(huán)因子,比如在這個例子當中,我們當前的i加入了ret之后,自增1變成了下一個將要累加的數(shù)。最后一個部分就是花括號當中的執(zhí)行體,也就是每次循環(huán)需要執(zhí)行的內(nèi)容。
寫成通用形式就是:
- for (initialization; test-expression; update-expression) {
- body;
- }
初始化、判斷條件以及更新因子這三個部分使用分號分隔。如果循環(huán)要執(zhí)行的內(nèi)容只包含一條語句,花括號也可以不寫。不過為了保證全局的代碼風格統(tǒng)一,最好還是統(tǒng)一使用花括號。
test-expression決定循環(huán)是否結束,因此,在每一次body開始執(zhí)行之前,都需要進行一次test-expression的判斷。當test-expression為true時,才會執(zhí)行body中的語句。
test-expression并不一定需要是一個bool值,C++會進行強制轉(zhuǎn)換。比如對于int類型,0值會被轉(zhuǎn)換為false,而其他值都會轉(zhuǎn)換成true。如:
- int ret = 0;
- int i;
- for (i = 100; i; i--) {
- ret += i;
- }
這段邏輯和上面一樣,同樣是計算了1到100累加的值。只不過這里我們進行的是倒序相加,循環(huán)的執(zhí)行條件為i >= 0。當i=0時結束,我們的判斷條件可以寫成i。int型的i會被強制轉(zhuǎn)換成bool型,當i=0時,值為false,循環(huán)結束。其中自減符的用法和自增類似。
進階用法
首先,我們可以將循環(huán)因子的聲明寫入for循環(huán)當中:
- // version1
- int i;
- for (i = 0; i < 100; i++) ret += i;
- // version2
- for (int i = 0; i < 100; i++) ret += i;
這樣有兩個好處,第一是簡化了代碼,將i的聲明語句寫入了for循環(huán)當中,可讀性也更好。另一點是限定了i這個變量的使用范圍,在for循環(huán)當中聲明的變量,它的作用域也只有for循環(huán),出了循環(huán)之后,i這個變量將消失。
不過在一些老舊的編譯器(如VC6.0)當中并不會這樣,循環(huán)當中聲明的變量依然會繼續(xù)存在。
另外initialization; test-expression; update-expression這三條語句都不是必須的,可以根據(jù)我們的需要進行省略。
比如for循環(huán)所需要的初始化工作之前已經(jīng)完成,那么就可以省略initialization:
- int i = 0;
- for (; i < 100; i++) ret += i;
比如我們也可以將循環(huán)的結束條件放在for循環(huán)的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循環(huán)是非常靈活的, 使用得當完全可以代替while循環(huán)和do while循環(huán)。
不過除非必要,我們還是要盡量遵守代碼規(guī)范,不要省略條件,這樣代碼可讀性也會更好一些。