【C++ 筆記】常數 / 運算子(上) - part 3

很感謝你點進來這篇文章。

你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧!

回顧上集內容:

C++ 常見常用資料型態:int、float、double、char,目前只要記得這些即可。

常數(Const)

常數就是不能變的數,被定義為常數後就是一個固定值,又稱實字(也可稱字面量:iteral)。

實字就是字面上的數值,1 就是 1,他固定不變,總之就是表示固定不變的量。

總之就把常數想像成是將一個人石化就對了!

常數定義如下:

1
#define identifier value

1
const type variable = value;

type -> 資料型態
vairable -> 變數
value -> 數值

以下是一個範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main()
{
const int LENGTH = 10;
const int WIDTH = 5;
const char NEWLINE = '\n';
int area;

area = LENGTH * WIDTH;
cout << area;
cout << NEWLINE;
return 0;
}

輸出結果:

1
2
50

程式碼範例取自:C++ 常量 | 菜鸟教程

程式碼說明:

通常被常數宣告的變數之名稱我們都會習慣用大寫表示,小寫就表示可變變數。

而 NEWLINE 則是以 char(字元) 進行常數變數宣告,表示儲存字元的意思。

字串是由一串字元組成的,字元就好比單一一個英文字母 abcdefg,也可是其他特殊符號 !@#$%^ 等等,而很多個字元組成再一起就形成了一個字串。

所以字串是字元的集合體。

所以字串就是很多字、串在一起。

而 NEWLINE 內容物是 ‘\n’,而需要注意的是,由”成對”單引號「’’」組成的是字元;由”成對”雙引號「””」組成的是字串。

所以跳脫字元 \n 表示換行,也是一種字元。

跳脫字元(Escape Character)

跳脫字元(又可稱逸出字元、轉義字元:Escape Character),為什麼叫跳脫字元?因為字元想逃跑(X

因為跳脫字元可以讓後面跟隨的字元「跳脫」出原本的字面意義或功能,從而賦予其不同的含義或用途。

像是 \n 表示換行,所以後面的字元是不是也跟著一起換行?

而跳脫字元主要以「\」反斜線後面跟上一個英文字母為主,表示一個特殊意義,注意喔,不是這個斜線「/」,是這個斜線:「\」。

然後讓我們介紹幾個跳脫字元:

跳脫字元意義
\”顯示雙引號
\’顯示單引號
\顯示反斜線
\0空字元(backslash)
\a蜂鳴器警報(alert bell)
\b退格(backspace)
\n換行(newline)
\tTab(horizontal tab -> 水平縮排)
\vTab(Vertical tab -> 垂直縮排)

以下是一個範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main(){
cout << "換行 : \n";
cout << "顯示單引號 : \'" << endl;
cout << "顯示雙引號 : \"" << endl;
cout << "顯示反斜線 : \\" << endl;
cout << "退格 : 退格\b退格" << endl;
cout << "水平縮排 : \t水平縮排" << endl;
cout << "垂直縮排 : \v垂直縮排";
return 0;
}

輸出結果:

1
2
3
4
5
6
7
8
換行 :
顯示單引號 : '
顯示雙引號 : "
顯示反斜線 : \
退格 : 退 退格
水平縮排 : 水平縮排
垂直縮排 :
垂直縮排

C++ 運算子(Operator)

C++ 有支援以下運算子:

  • 算術運算子
  • 關係運算子
  • 邏輯運算子
  • 位元運算子
  • 指定運算子

在步入介紹逐個運算子之前,我們需要了解以下的概念:

運算子是什麼?我們先來舉個例子:

1 + 1

看到這個,你腦海裡浮現過後的第一個念頭肯定會是 2

讓我們看到 1,它其實就叫做運算元。

+」是運算子。

1 + 1」,被稱為(運算式,或稱表達式:expression)

元是資料型態,子是要進行何種操作(像是加法)。

運算式就是運算元加上運算子的結構。

讓我們來整理一下:

  • 運算元(Operand):在運算式中,運算元是資料的值。在例子「1 + 1」當中,兩個「1」都是運算元,運算元是被操作、運算的物件。

  • 運算子(Operator):運算子是一個進行操作的符號。在例子「1 + 1」當中,「+」就是一個運算子,表示加法操作、運算。

  • 運算式(Expression):運算式是由運算元和運算子組成的結構,用於進行計算並回傳結果。在例子中,「1 + 1」就是一個運算式,進行加法運算並回傳結果為「2」。

算術運算子(Arithmetic Operator)

算術運算子,其實就是數學運算子,很簡單,它就是專門在做加減乘除的事情。

以下是 C++ 的算術運算子:

運算子描述
+將兩個運算元相加。
-第一個運算元減去第二個運算元。
*將兩個運算元相乘。
/相除。第一個運算元作為被除數,第二個作為除數。
%稱為取模(mod),相當於除法運算當中的取得「餘數」。
++遞增運算子,整數值+1。
—(兩個減號)遞減運算子,整數值-1。

以下是有關於四則運算與取模運算子的範例:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main(){
cout << 1 + 1 << endl;
cout << 1 - 1 << endl;
cout << 1 * 1 << endl;
cout << 1 / 2 << endl;
cout << 1 % 2 << endl;
return 0;
}

輸出結果:

1
2
3
4
5
2
0
1
0
1

看到這個輸出結果,你可能會疑惑說,為什麼 1 / 2 的結果不會是 0.5 呢?而是 0。

那這個就是有關於資料型態的部分啦!

像是我們在程式當中所看到的,其實都是屬於 int 資料型態的類別,那要有小數點,我們可使用 float、double 這類的資料型態。

具體來說程式碼應該可像以下這樣修改:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;

int main(){
cout << 1.0 + 1.0 << endl;
cout << 1.0 - 1.0 << endl;
cout << 1.0 * 1.0 << endl;
cout << 1.0 / 2.0 << endl;
cout << 1 % 2 << endl;
return 0;
}

輸出結果:

1
2
3
4
5
2
0
1
0.5
1

至於為什麼在取模運算子時,不能夠使用 1.0、2.0 這類的浮點數寫法呢?原因是這樣的,執行時會出現以下錯誤:

1
types 'double' and 'double' to binary 'operator%'

所以說取模運算子只能運用在於整數型態(int)的部分。

如果我們只將一個數字改成浮點數的形式會是怎樣的呢?另外它的資料型態會改變嗎?

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <typeinfo> // New Change
using namespace std;

int main(){
cout << 1.0 + 1.0 << endl;
cout << 1.0 - 1.0 << endl;
cout << 1.0 * 1.0 << endl;
cout << typeid(1.0 / 2).name() << endl; // New Change
cout << 1 % 2 << endl;
return 0;
}

輸出結果:

1
2
3
4
5
2
0
1
d
1

順帶一提,在 C++ 當中如果我們要查看一個物件的資料型態的話,我們可以引入 typeinfo 這個標頭檔。

1
#include <typeinfo>

使用 typeid(數值).name() 就能夠查看這個數值的資料型態了!

i:int,整數。

f:float,單精度浮點數。

d:double,雙精度浮點數。

Ss:String,字串。

c:字元。

可以從上面範例的輸出結果得到 d,表示是一個雙精度浮點數。

遞增遞減運算子(++、—)

遞增遞減運算子有所謂的前置、後置的規則,也就是前綴、後綴的意思。

比如說一個變數 x,如下:

1
++x

以上是前置,前綴。

1
x++

以上是後置,後綴。

前置就是放在前面,後置就是放在後面。 純屬幹話(X

以下是有關於個別遞增遞減運算子的效力:

1
2
3
x = x + 1;
// 等於
x++;
1
2
3
x = x - 1;
// 等於
x--;

如果是將 ++、— 放在前面,則當我們運算式在完成運算「之前」會自動遞增或遞減,然後並不會自動將遞增或遞減後的值放到變數當中。

放在後面則是在運算式完成「之後」自動遞增遞減,然後將遞增或遞減值加入到變數當中。

以下是一個範例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;

int main(){
int a = 10;
int c;
c = a++;
cout << "After a++ of c : " << c << endl;
cout << "a : " << a << endl;
c = ++a;
cout << "After ++a of c : " << c << endl;
cout << "a : " << a << endl;
return 0;
}

輸出結果:

1
2
3
4
After a++ of c : 10
a : 11
After ++a of c : 12
a : 12

關係運算子、比較運算子(Relational operator or Comparison operator)

運算子描述
==比較兩個運算元是否相等。是則回傳 true,不是則回傳 false。
!=比較兩個運算元是否「」相等。是則回傳 true,不是則回傳 false。
>比較左運算元是否大於右運算元。是則回傳 true,不是則回傳 false。
<比較左運算元是否小於右運算元。是則回傳 true,不是則回傳 false。
>=比較左運算元是否「大於或等於」右運算元。是則回傳 true,不是則回傳 false。
<=比較左運算元是否「小於或等於」右運算元。是則回傳 true,不是則回傳 false。

比較運算子就是字面上的意思,比大小啦!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;

int main(){
int a = 10;
int b = 20;

if (a == b) {
cout << "a == b : " << "true" << endl;
} else {
cout << "a == b : " << "false" << endl;
}

if (a != b) {
cout << "a != b : " << "true" << endl;
} else {
cout << "a != b : " << "false" << endl;
}

if (a > b) {
cout << "a > b : " << "true" << endl;
} else {
cout << "a > b : " << "false" << endl;
}

if (a < b) {
cout << "a < b : " << "true" << endl;
} else {
cout << "a < b : " << "false" << endl;
}

if (a >= b) {
cout << "a >= b : " << "true" << endl;
} else {
cout << "a >= b : " << "false" << endl;
}

if (a <= b) {
cout << "a <= b : " << "true" << endl;
} else {
cout << "a <= b : " << "false" << endl;
}

return 0;
}

哇,靠,好長一串程式碼。

不用擔心,這些其實都只是簡單的條件判斷而已,

在 C++ 當中,使用 if 做條件判斷,意思就是如果。

我們要使用 if 做條件判斷,則條件是需要被兩個小括號給括起來的,像是這樣:

if (a == b){
a == b 如果是 True 的話這邊才會執行哦!
}

然後以兩個中括號將要執行的程式碼包圍起來。(前提是 a == b 要是 true)

而預設條件判斷會自動判斷 true,只有 true 才會執行中括號的程式碼。

而 else 語句則是判斷說:如果上層的條件(if)的條件不成立的話,也就是實際執行 a == b 有可能是 false,那就會執行 else 然後中括號裡面的程式碼。

接下來,讓我們看看程式碼執行的結果:

1
2
3
4
5
6
a == b : false
a != b : true
a > b : false
a < b : true
a >= b : false
a <= b : true

然後接著我們一起來檢查 a、b 之間的值:

a == b,首先一開始我們設定變數 a = 10、b = 20,想必兩個值肯定不會相同嘛,false。

a != b,這是對的,a 確實不等於 b,所以會顯示 true。

a > b,這是錯的,a 小於 b,所以顯示 false。

a < b,這是對的,a 小於 b,所以顯示 true。

a >= b,這是錯的,a 不可能大於或等於 b,所以顯示 false。

a <= b,這是對的,a 小於或等於 b,所以顯示 true。

總結

常數(Const)是一個值(value)不能變動的數。

定義方式:

1
#define identifier value

1
const type variable = value;

跳脫字元是一種特殊字元,能夠對字串或字元進行特殊的操作,以反斜線「\」加上其他字元結合而成,像是 \n,代表換行的意思。

C++ 有支援以下運算子:

  • 算術運算子
  • 關係運算子
  • 邏輯運算子
  • 位元運算子
  • 指定運算子

今天講到了算術運算子與關係運算子。

運算元:資料型態的值,被運算的物件。

運算子:能夠對運算元運算的符號。像是 +,能夠進行 1 + 1 運算。

運算式:也可稱為表達式,由運算元跟運算子組合而成,1 + 1 整體是一個運算式。

算術運算子:

基本的加減乘除(+、-、*、/)符號,加上一個取餘數的符號「%」。

++、—(加加、減減)稱為遞增、遞減運算子,自加、減 1,前置後置有差別。

後置可以使運算子的前一個變數自加、減 1,前置不變。

後置表示在運算式完成後才會自加自減。

前置表示在運算式完成前自加自減。

關係運算子:

又可稱為比較運算子,主要用於比較。(來廁所比大小啦!!!

真的是比大小,沒騙你XD

「==」 (比較兩數是否相等)

「>」 (比較左數是否大於右數)

「<」 (比較左數是否小於右數)

「>=」 (比較左數是否大於或等於右數)

「<=」 (比較左數是否小於或等於右數)

參考資料

C++ 常量 | 菜鸟教程

C++教學(三):變數與常數-做 個 有 趣 的 人|痞客邦

const (C++) | Microsoft Learn

C++中单引号双引号的区别_c++单引号和双引号的区别-CSDN博客

文章三 c++ 的跳脫字元-angel123的部落格|痞客邦

C++ 自增自减运算符 | 菜鸟教程

iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

C++ 用 typeid 查詢變數型態-程式語言教學|痞客邦

C++ 印出變數類型 | ShengYu Talk

C++ 运算符 | 菜鸟教程