所謂的bool型別是用來儲存真、假值的變數,真用1表示,假用0表示。
bool常出現在比較運算(或稱關係運算),也就是常見的比大小、判斷相等,例如「5>3」為真、其值為1,「4>4」為假、其值為0,這些比較運算的結果可以直接賦值給bool或進行輸出,只不過記得將其()起來,因為進行比較運算的順序在較後面。
其他常見的比較運算有判斷相等「==」(與賦值不同,賦值是單個=)、不相等「!=」、大於等於「>=」、小於等於「<=」等等。
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,y;
cin>>x>>y;
bool b=(x*y>=20);
cout<<b; //也可以直接cout<<(x*y>=20);
//若輸入「3 6」,因為3*6為18會輸出「0」
//若輸入「4 5」,因為4*5為20會輸出「1」
}
除此之外,不同條件間還可以進行邏輯運算,所謂邏輯運算是指以bool型別為主角的運算,有三種。
第一是「且」,寫法為「a&&b」,僅有a、b皆為1時結果才是1,否則為0。
第二是「或」,寫法為「a||b」,只要a、b至少一個為1時結果就是1,否則為0。
第三是「非」,寫法為「!a」,若a為1,!a會得到0,反之a為0,!a會得到1。
以上的a、b都能使用bool變數或直接寫比較運算的式子。
這三種邏輯運算是可以混用的,只是需要注意優先順序為「! > && > ||」,若不確定順序就放上()來讓特定內容先算完再進行後續運算。
#include<bits/stdc++.h>
using namespace std;
int main(){
int x,y;
cin>>x>>y;
bool b=(x*y>=20 && x*y<=30); //b值代表x*y是否在20~30(含)以內
bool c=(x==0 || y==0); //c值代表x,y是否至少有一個為0
cout<<(!b); //將b值之真假顛倒,輸出結果可以理解為x*y不在20~30內
}
if-else是C++中的條件判斷語句,可以特定條件執行不同的程式碼。
if-else最基本的結構如下,如果其中的「條件」成立,就會執行{}內的程式,其中「條件」可以是bool變數或上述的比較運算、邏輯運算式子。
if(條件){
//要執行的程式碼
}
如果要不成立時執行程式碼,可以使用else,當else前的if不成立就會執行else後的{}。
if(條件){
//條件成立要執行的程式碼
}else{
//條件不成立要執行的程式碼
}
若要在多個不同條件執行不同程式,可以在else後繼續加上不同條件,如下。
if(條件一){
//條件一成立要執行的程式碼
}else if(條件二){
//條件二成立要執行的程式碼
}else if(條件三){
//條件三成立要執行的程式碼
}else{
//以上條件都不成立要執行的程式碼
}
注意以上的if-else程式碼,如果是用if(條件1){條件1程式碼}...else if(條件n){條件n程式碼}else{都不符合的程式碼}的形式,那麼只會有一個{}的內容執行到,只要遇到符合的條件就會跳過所有後續的else。
其實可以將if-else的語法用中文下去理解,也就是「如果(條件1){執行條件1的程式},否則如果(條件2){執行條件2的程式}」,否則{執行以上條件都不成立的程式}。
如果沒有{},那麼if-else會綁定後面的第一句,也就是第一個分號前的內容,所以以下程式會輸出「World!」。
#include<bits/stdc++.h>
using namespace std;
int main(){
if(5==3)cout<<"Hello, ";
cout<<"World!";
}
以下是if-else的範例,可以用來判斷輸入的數是奇數還是偶數,奇數、偶數分別輸出「odd」跟「even」。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n%2==1){
cout<<"odd";
}else{
cout<<"even";
}
}
其實也可以把int直接當作bool用,此時除了0會是false之外,其他包括正數、負數都會當作true。
換句話說,假設今天是一個int n;放在if(n){...},其實效果完全等同於if(n!=0){...},可以直接解讀為「若n不為0」。
因此以下程式碼同樣可以分辨奇偶數。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
if(n%2){
cout<<"odd";
}else{
cout<<"even";
}
}
而在C++中若要重複執行一樣或類似的程式碼就需要使用迴圈這個功能。
較簡單的迴圈是while迴圈,語法為「while(條件){重複執行的程式}」,while的中文意思之一是「當...」,所以此迴圈的作用便是當條件成立時會一直執行裡面的程式,如下。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=1;
while(n<=5){
cout<<n<<' ';
n++;
}
cout<<'\n';
//以上會輸出「1 2 3 4 5 」,每次會先輸出n,再將n增加1,直到n變為6過後因為條件不符合就跳出迴圈
n=20;
while(n<10){
cout<<"There will not be run.\n";
n++;
}
//在while迴圈開始時也會進行條件的檢查,以上程式碼在這個時候便會跳出迴圈了,因此不輸出內容
n=5;
while(n--){
cout<<"There will be run n times.\n";
}
//以上會輸出5行「There will be run n times.」
//原理可以參考0-1章的「小技巧:變數操作完會丟出操作完的值」與本章的「小技巧:將其他型別的變數當作bool」
//可以在以上迴圈中加入「cout<<n<<' ';」來幫助理解
}
另外控制迴圈還有「break;」與「continue;」兩個方法。
「break;」執行後會直接離開迴圈,「continue;」會直接重新開始迴圈,並且同樣會執行迴圈條件的檢查。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n=1;
while(n<=5){
if(n==3)break;
cout<<n<<' ';
n++;
}
cout<<'\n';
//以上會輸出「1 2 」,當n變3後,因為條件仍符合,迴圈會繼續執行,但馬上會因為「break;」而跳出迴圈
n=0;
while(n<=5){
n++;
if(n%3==2)continue;
cout<<n<<' ';
}
//以上會輸出「1 3 4 6」,在n為2、5時會執行到「continue;」而跳過後面的輸出
}
某些情況下會需要改成在每次執行完迴圈後判斷是否繼續執行還是跳出,雖然C++有內建「do-while」語法,但建議可以用以下方式實作即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
while(1){ //因1會當作true,所以此迴圈會一直執行
//迴圈要執行的程式
if(終止條件)break; //當終止條件成立後跳出迴圈,但請確保此條件會成立,否則會進入無限迴圈
}
}
另一種常見的迴圈為for迴圈,語法為「for(初始化;條件;遞增式){程式碼}」,迴圈第一次執行前會先執行「初始化」的賦值或者宣告;接著每次迴圈前會先檢查「條件式」,為真的話執行「程式碼」,否則離開迴圈;而每次迴圈執行完則會執行「遞增式」,常見的作法是透過「++」、「+=」等等來改變變數。以下是for迴圈的例子。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cout<<i<<' ';
}
//輸入n後該程式碼會輸出由1到n
}
若覺得for迴圈的執行順序很複雜,可以用以下方式思考。
迴圈每次執行時,變數會從「初始化」的值開始,每次依照「遞增式」改變值,直到「條件」不符合,而過程中的每個值就是執行一次迴圈內的「程式碼」。
如此一來就可以輕易搞懂「for(int i=1;i<32;i*=2){...}」會如何運作了,i從1開始,每次乘2,直到i<32不符合,也就是i值會是1、2、4、8、16,迴圈共執行5次。
而for迴圈由於可以同時宣告變數並操控的特性,常用於配合陣列操作,如一次性讀入n個變數可以用「for(int i=0;i<n;i++)cin>>a[i];」或「for(int i=1;i<=n;i++)cin>>a[i];」,兩者分別是將n個數儲存在a[0]~a[n-1]跟a[1]~a[n],建議養成使用前者從0編號的習慣,後續實作會方便一些。
而for迴圈一樣可以使用「break;」與「continue;」,基本上都跟while迴圈時使用得效果一樣,continue一樣會跳到開頭並進行遞增後再條件檢查。需要注意for迴圈初始化宣告的變數只能用在迴圈內。另外for迴圈的「初始化」、「條件」、「遞增式」皆可留空,而條件式留空時的效果與while(1)類似。
與if-else一樣,while迴圈、for迴圈如果沒有{},那麼迴圈會綁定後面的第一句,也就是第一個分號前的內容。
而迴圈是可以寫在另一個迴圈內的,稱作巢狀迴圈。
而其實執行時的順序跟原本的迴圈一樣,從外層迴圈開始跑,而當執行外層迴圈的程式碼到內層迴圈時,就進入內層迴圈的程式碼直到跳出內層的迴圈。
如此可以用來進行二維、多維陣列的存取,也可以進行一些需要兩兩對應甚至更複雜的重複操作,如以下的九九乘法表就是簡單的例子。
#include<bits/stdc++.h>
using namespace std;
int main(){
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
cout<<i*j<<' ';
}
cout<<'\n';
}
//會輸出以下內容
//1 2 3 4 5 6 7 8 9
//2 4 6 8 10 12 14 16 18
//3 6 9 12 15 18 21 24 27
//4 8 12 16 20 24 28 32 36
//5 10 15 20 25 30 35 40 45
//(略)
//9 18 27 36 45 54 63 72 81
}
若有回覆需求可以選擇提供email。