C# 入門指南
單元 5 - 陳述與運算式
陳述 (statement) 是程式中執行的單位, C# 中的陳述要以分號結尾
C# 的陳述只能有以下四種
- 宣告 (declaration) 與指派 (assignment) ;
- 呼叫 (call) ;
- 遞增 (increment) 或遞減 (decrement) ;
- 建立新的物件 (object) 或使用陳述式關鍵字 (statement keyword) 。
宣告是設定變數的型態種類,指派就是替變數設定數值,例如以下宣告整數變數 a ,同時用等號指派 0 給 a
int a = 0;
呼叫是指呼叫方法 (method) ,方法內設定專屬於方法的程式碼,藉由呼叫來執行這些程式碼,例如 Console 的 WriteLine() 可以印出參數 (parameter) ,如果呼叫時沒有提供參數就會印出新行
Console.WriteLine();
遞增
a++;
a--;
建立新物件使用關鍵字 (keyword) new ,例如
new int();
其他用 C# 進行的任何運算都必須包含在以上四種陳述中。
運算式 (expression) 由運算元 (operand) 與運算子 (operator) 組合而成,最簡單的運算式為使用單元運算子的正、負號,如下
運算子 | 功能 | 範例 |
---|---|---|
+ | 正 | +a |
- | 負 | -a |
正、負號適用在數字型態,例如
using System;
namespace ExpDemo01
{
class Program
{
static void Main(string[] args)
{
int a = -1;
int b = +a;
int c = -a;
Console.WriteLine(b);
Console.WriteLine(c);
}
}
}
//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:ExpDemo01
// 檔名:Program.cs
// 功能:示範 C# 的運算式
// 作者:張凱慶
跟數學上一樣,正號不會改變正負值,負號則會負負得正,以上例子執行結果如下
C:\ExpDemo01> dotnet run |
-1 |
1 |
C:\ExpDemo01> |
一般運算子都須結合兩個運算元,像是邏輯運算子 (logical operator)
運算子 | 功能 | 範例 |
---|---|---|
& | 且 | a & b |
&& | 條件式且 | a && b |
| | 或 | a | b |
|| | 條件式或 | a | b |
^ | 互斥或 | a ^ b |
! | 非 | !a |
! 也是單元運算子, & 、 && 、 || 、 | 及 ^ 則需要兩個運算元,例如
using System;
namespace ExpDemo02
{
class Program
{
static void Main(string[] args)
{
bool a = true;
bool b = false;
Console.WriteLine(a & b);
Console.WriteLine(a | b);
Console.WriteLine(a ^ b);
Console.WriteLine(!a);
}
}
}
//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:ExpDemo02
// 檔名:Program.cs
// 功能:示範 C# 的運算式
// 作者:張凱慶
執行結果如下
C:\ExpDemo02> dotnet run |
False |
True |
True |
False |
C:\ExpDemo02> |
條件式且 && 與條件式或 || 會先計算第一個運算元的值,若 a && b 的 a 為 false ,就直接回傳 false ,此時不會再計算 b ,因此可以縮短計算時間,同樣的 a || b 的 a 為 true 的話,就直接回傳 true 。
算術運算子 (arithmetic operator) 可用在整數 (integer) 及浮點數 (floating-point number) ,計算結果也為整數或浮點數
運算子 | 功能 | 範例 |
---|---|---|
++ | 遞增 | a++ |
-- | 遞減 | a-- |
+ | 加 | a + b |
- | 減 | a - b |
* | 乘 | a * b |
/ | 除 | a / b |
% | 取餘數 | a % b |
例如
using System;
namespace ExpDemo03
{
class Program
{
static void Main(string[] args)
{
double a = 100.0;
double b = 5.0;
a++;
Console.WriteLine(a);
a--;
Console.WriteLine(a);
Console.WriteLine(a + b);
Console.WriteLine(a - b);
Console.WriteLine(a * b);
Console.WriteLine(a / b);
Console.WriteLine(a % b);
}
}
}
//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:ExpDemo03
// 檔名:Program.cs
// 功能:示範 C# 的運算式
// 作者:張凱慶
執行結果如下
C:\ExpDemo03> dotnet run |
101 |
100 |
105 |
95 |
500 |
20 |
0 |
C:\ExpDemo03> |
加號 + 另外可做字串 (string) 相接與委派組合,減號 - 可做委派移除。
比較運算子用於測試兩個運算元之間的關係,結果回傳布林值
運算子 | 功能 | 範例 |
---|---|---|
== | 相等 | a == b |
!= | 不相等 | a != b |
> | 大於 | a > b |
>= | 大於等於 | a >= b |
< | 小於 | a < b |
<= | 小於等於 | a <= b |
例如
using System;
namespace ExpDemo04
{
class Program
{
static void Main(string[] args)
{
int a = 11;
int b = 22;
bool c = a >= b;
Console.WriteLine(c);
bool d = a <= b;
Console.WriteLine(d);
bool e = a == b;
Console.WriteLine(e);
bool f = a != b;
Console.WriteLine(f);
}
}
}
//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:ExpDemo04
// 檔名:Program.cs
// 功能:示範 C# 的運算式
// 作者:張凱慶
執行結果如下
C:\ExpDemo04> dotnet run |
False |
True |
False |
True |
C:\ExpDemo04> |
我們運用的等號,其實屬於指派運算子 (assignment operator) ,所謂的指派是把等號右邊的值給左邊的變數
運算子 | 功能 | 範例 |
---|---|---|
= | 指派 | a = b |
+= | 相加同時指派 | a += b |
-= | 相減同時指派 | a -= b |
*= | 相乘同時指派 | a *= b |
/= | 相除同時指派 | a /= b |
%= | 取餘數同時指派 | a %= b |
**= | 取指數同時指派 | a **= b |
除了算術運算子可以和指派運算子連在一起用之外,邏輯運算子也可以和指派運算子連在一起用。
例如
using System;
namespace ExpDemo05
{
class Program
{
static void Main(string[] args)
{
int a = 1;
a += 2;
a -= 2;
a *= 2;
a /= 2;
a %= 2;
Console.WriteLine(a);
}
}
}
//《程式語言教學誌》的範例程式
// http://kaiching.org/
// 專案:ExpDemo05
// 檔名:Program.cs
// 功能:示範 C# 的運算式
// 作者:張凱慶
執行結果如下
C:\ExpDemo05> dotnet run |
1 |
C:\ExpDemo05> |
有沒有看的眼花撩亂?居然有 f = a != b 之類的式子出來,這是因為運算子有計算的優先次序 (precedence) ,由於 != 的優先順序在 = 之前,所以 a != b 會先被計算,結果才會指派到 f 之中。如果不是很清楚各個運算子的優先次序,保險一點的做法可以用小括弧,先把要先被計算的運算式圍起來,例如
bool f = (a != b);
這是因為小括弧有最高的優先計算次序。
以上示範的都是寫在單一行的陳述,然而許多控制結構 (control structure) 是屬於多行的複合陳述 (compound statement) ,我們先來討論控制結構中的選擇結構!
相關教學影片
中英文術語對照 | |
---|---|
算術運算子 | arithmetic operator |
指派 | assignment |
指派運算子 | assignment operator |
呼叫 | call |
複合陳述 | compound statement |
控制結構 | control structure |
宣告 | declaration |
遞減 | decrement |
運算式 | expression |
浮點數 | floating-point number |
遞增 | increment |
整數 | integer |
關鍵字 | keyword |
邏輯運算子 | logical operator |
方法 | method |
運算元 | operand |
運算子 | operator |
物件 | object |
參數 | parameter |
計算的優先次序 | precedence |
陳述 | statement |
陳述式關鍵字 | statement keyword |
字串 | string |
重點整理 |
---|
1. 陳述是程式中執行的單位, C# 中的陳述要以分號結尾。 |
2. C# 的陳述只有四種,分別是宣告與指派、呼叫、遞增或遞減、建立新的物件或使用陳述式關鍵字。 |
3. 運算式由運算元與運算子組合而成。 |
4. 正號不會改變運算元的正負值,負號會負負得正。 |
5. 邏輯運算子包括且、條件式且、或、條件式或、互斥或、非。 |
6. 算術運算子包括遞增、遞減、加、減、乘、除、取餘數。 |
7. 比較運算子包括相等、不相等、大於、大於等於、小於、小於等於。 |
8. 等號是指派運算子,指派運算子可以和算術運算子、邏輯運算子連在一起用。 |
9. 小括弧具有最高的計算優先次序。 |
問題與討論 |
---|
1. 邏輯運算子可以運用在整數、浮點數或字串嗎? |
2. 字串為什麼可以用加法?那也可以用乘法、減法或除法嗎? |
3. 為什麼測試兩個變數相等的運算子為連續兩個等號? |
4. 為什麼計算的優先次序很重要? |
練習 |
---|
1. 建立一個新專案 Exercise0501 ,建立兩個 int 變數 a 及 b , a 設定為 2 , b 設定為 8 ,利用 + 、 - 、 * 、 / 、 % 計算出兩者加、減、乘、除、取餘數的結果。 |
2. 承上題,另建立一個新專案 Exercise0502 ,利用 Console 的 ReadLine() 方法取得使用者輸入的字串,並用 Convert.ToInt32() 轉換為整數,將取得的整數指派給 a 及 b 後,然後再計算出結果。 |
3. 建立一個新專案 Exercise0503 ,宣告一個字串變數 a ,並且將 a 的值設定為 "*" ,然後印出 a 、 a + a 、 a + a + a 、 a + a + a + a 、 a + a + a + a + a 。 |