自學二、運算子和表達式

2020-08-13 12:26:21

運算子是一種告訴編譯器執行特定的數學或邏輯操作的符號。C# 有豐富的內建運算子,分類如下:

  • 算術運算子
  • 關係運算符
  • 邏輯運算子
  • 位運算子
  • 賦值運算子
  • 其他運算子

§4.1 運算子和表達式概念

運算子:能夠幫助使用者實現並完成某些運算操作的指令。

表達式:由運算元和運算子組成的序列,產生單一的值。

§4.2 算術運算子與算術表達式

§4.2.1 算術運算子

算術運算子包含2個單目運算子(正和負)和5個雙目運算子(加、減、乘、除、取模)。具體符號和對應功能如下圖表所示:

第四章 运算符和表达式

 

§4.2.2 算術表達式

在表達式中使用算術運算子, 則該表達式稱爲算術表達式。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int iNum_1 = 12;
            int iNum_2 = 10;
​
            float fNum_1 = 2.5f;
            float fNum_2 = 2.0f;
​
            //加
            int sum = iNum_1 + iNum_2;//sum = 22
​
            //減
            int sub = iNum_1 - iNum_2;//sub = 2
​
            //乘
            int mul = iNum_1 * iNum_2;//mul = 120
​
            //整除
            int div = iNum_1 / iNum_2;//div = 1
​
            //浮點除
            float fdiv = fNum_1 / fNum_2;//fdiv = 1.25
​
            float fdiv_1 = fNum_1 / iNum_1;//fdiv_1 = 0.208333
            float fdiv_2 = iNum_1 / fNum_1;//fdiv_2 = 4.8
​
            //取餘
            int mod = iNum_1 % iNum_2;//mod = 2
​
            Console.WriteLine("sum = {0}\nsub = {1}\nmul = {2}\ndiv = {3}\nfdiv = {4}\nfdiv_1 = {5}\nfdiv_2 = {6}\nmod = {7}\n", sum, sub, mul, div, fdiv, fdiv_1, fdiv_2, mod);
        }
    }
}
/*輸出結果*/
/*
sum = 22
sub = 2
mul = 120
div = 1
fdiv = 1.25
fdiv_1 = 0.2083333
fdiv_2 = 4.8
mod = 2
*/

注意:

1、如果 +、-、*、/ 運算的兩個數中有一個爲浮點數, 爲防止數據精度丟失,則結果應使用浮點數表示;

2、除法運算(/),預設爲整除運算,其運算元中除數不能爲0, 兩整數相除時,其值必須取整,小數位忽略 不計; 若運算的兩個數中有一個爲浮點數,則結果爲浮點數;

3、取模運算(%),運算子左右兩側運算元必須爲整數,第二個運算元不能爲0。

§4.3 關係運算符與關係表達式

§4.3.1 關係運算符

在數學中,經常需要比較兩個數的大小。在C#語言中, 關係運算符的作用就是判斷兩個運算元的大小關係。具體符號和對應功能如下圖表所示:

第四章 运算符和表达式

 

§4.3.2 關係表達式

在表達式中使用關係運算符, 則該表達式稱爲關係表達式。關係運算符用於對兩個表達式的值進行比較,返回一個真值或者假值。其中使用非0數表示真值(一般爲數位1), 使用0表示價值。真值表示指定的關係成立, 假值則表示指定的關係不成立。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int iNum_1 = 123;
​
            int iNum_2 = 456;
​
            Console.WriteLine("iNum_1 > iNum_2 = {0}\n", iNum_1 > iNum_2);
            Console.WriteLine("iNum_1 >= iNum_2 = {0}\n", iNum_1 >= iNum_2);
            Console.WriteLine("iNum_1 < iNum_2 = {0}\n", iNum_1 < iNum_2);
            Console.WriteLine("iNum_1 <= iNum_2 = {0}\n", iNum_1 <= iNum_2);
            Console.WriteLine("iNum_1 == iNum_2 = {0}\n", iNum_1 == iNum_2);
            Console.WriteLine("iNum_1 != iNum_2 = {0}\n", iNum_1 != iNum_2);
        }
    }
}
/*輸出結果*/
/*
iNum_1 > iNum_2 = False
​
iNum_1 >= iNum_2 = False
​
iNum_1 < iNum_2 = True
​
iNum_1 <= iNum_2 = True
​
iNum_1 == iNum_2 = False
​
iNum_1 != iNum_2 = True
*/

§4.4 賦值運算子與賦值表達式

§4.4.1 賦值運算子

C程式中常常遇到的賦值符號【=】就是賦值運算子, 其作用就是將一個數據賦給一個變數。

eg:

int iNum = 100;//變數iNum的值爲100

§4.4.2 賦值表達式

在表達式中使用賦值運算子, 則該表達式稱爲賦值表達式。C#語言中有兩種型別的賦值表達式:

  1. 左值(lvalue):指向記憶體位置的表達式被稱爲左值(lvalue)表達式。左值可以出現在賦值號的左邊或右邊。
  2. 右值(rvalue):術語右值(rvalue)指的是儲存在記憶體中某些地址的數值。右值是不能對其進行賦值的表達式,也就是說,右值可以出現在賦值號的右邊,但不能出現在賦值號的左邊。

變數是左值,因此可以出現在賦值號的左邊。數值型的字面值是右值,因此不能被賦值,不能出現在賦值號的左邊。下面 下麪是一個有效的語句:

int g = 20;

但是下面 下麪這個就不是一個有效的語句,會生成編譯時錯誤:

10 = 20;

§4.5 邏輯運算子與邏輯表達式

邏輯運算子包含2個雙目運算子(&&(邏輯與) 和 ||(邏輯或))和1個單目運算子(!(邏輯非))。具體符號和對應功能如下圖表所示:

第四章 运算符和表达式

 

§4.5.2 邏輯表達式

在表達式中使用邏輯運算子, 則該表達式稱爲邏輯表達式。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            bool iNum_1 = true;
            bool iNum_2 = false;
​
            Console.WriteLine("iNum_1 && iNum2 = {0}\n", iNum_1 && iNum_2);
​
            Console.WriteLine("iNum_1 || iNum2 = {0}\n", iNum_1 || iNum_2);
​
            Console.WriteLine("!iNum_2 = {0}\n", !iNum_2);
        }
    }
}
​
/*輸出結果*/
/*
iNum_1 && iNum2 = False
​
iNum_1 || iNum2 = True
​
!iNum_2 = True
*/

§4.6 位運算子與位表達式

位是計算機儲存數據的最小單位。一個二進制位可以表示兩種狀態(1和0),多個二進制位組合起來便可表示多種資訊。那麼, 什麼是二進制呢?

二進制是計算技術中廣泛採用的一種數制。二進制數據是用0和1兩個數碼來表示的數。它的基數爲2,進位規則是「逢二進一」,借位規則是「借一當二」,由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機系統使用的基本上是二進制系統,數據在計算機中主要是以【二補數】的形式儲存的。例如:

1    ->     0000 0001
​
2    ->     0000 0010
​
3    ->     0000 0011
​
-1   ->   1000 0001

注意:

二進制: 用 0 和 1 表示(8位元), 最左邊(最高位)是符號位:0表示正數, 1表示負數

正數:原碼、反碼、二補數相同

負數:

原碼:對應正數部分轉換二進制後, 高位補1

反碼:符號位除外,原碼其餘各位按位元取反, 0 -> 1, 1 -> 0

二補數:反碼 + 1(原碼取反 + 1),

如何將一個十進制數轉化成二進制數?

十進制數轉成二進制主要有以下幾種:

正數:除二取餘,然後倒序排列,高位補零

eg:

(115)10=(01110011)2

負數:先是將對應的正整數轉換成二進制後,高位補1,對二進制取反,然後對結果再加 1

eg:

(-1)10 = (1000 0001)2

小數:對小數點以後的數乘以 2,有一個結果吧,取 結果的整數部分(不是 1 就是 0),然後再用小數部分 再乘以 2,再取結果的整數部分......以此類推,直到小數部分爲 0 或者位數已經夠了則停止運算。然 後 把獲得的整數部分按先後 先後次序排列,就構成了二進制小數部分的序列;如果小數的整數部分有大於 0 的 整數時該如何轉換呢?如以上整數轉換 成二進制,小數轉換成二進制,然後拼接在一起即可)

eg:

(1.125)10 = (00000001.001)2

§4.6.1 位運算子

C#語言完全支援位運算,而且也能像彙編語言一樣用來編寫系統程式。具體符號和對應功能如下圖表所示:

第四章 运算符和表达式

 

注意:

按位元與(&):

1 & 1 = 1

1 & 0 = 0

0 & 1 = 0

0 & 0 = 0

按位元或(|):

1 | 1 = 1

0 | 1= 1

1 | 0 = 1

0 | 0 = 0

按位元互斥或(^):

1 | 1 = 0

0 | 1= 1

1 | 0 = 1

0 | 0 = 0

按位元取反(~):

1 -> 0, 0 -> 1

公式: ~num = -(num + 1)

注意: 按位元取反時, 包含符號位

左移(<<):每移一位, *2, 左移時, 符號位不動, 右邊空出的位置用0填充

右移(>>):每移一位, /2,右移時,符號位不動, 左邊空出的位置用與符號位相同的數值填充

§4.6.2 位表達式

在表達式中使用位運算子, 則該表達式稱爲位表達式。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int iNum_1 = 3;
            int iNum_2 = -5;
​
            Console.WriteLine("iNum_1 & iNum_2 = {0}\n", iNum_1 & iNum_2);
            Console.WriteLine("iNum_1 | iNum_2 = {0}\n", iNum_1 | iNum_2);
            Console.WriteLine("iNum_1 ^ iNum_2 = {0}\n", iNum_1 ^ iNum_2);
            Console.WriteLine("~iNum_2 = {0}\n", ~iNum_2);
            Console.WriteLine("iNum_1 >> 2 = {0}\n", iNum_1 >> 2);
            Console.WriteLine("iNum_1 << 2 = {0}\n", iNum_1 << 2);
        }
    }
}
/*輸出結果*/
/*
iNum_1 & iNum_2 = 3
​
iNum_1 | iNum_2 = -5
​
iNum_1 ^ iNum_2 = -8
​
~iNum_2 = 4
​
iNum_1 >> 2 = 0
​
iNum_1 << 2 = 12
*/

§4.7 複合賦值運算子

§4.7.1 複合賦值運算子

複合賦值運算子是C#語言中算術運算子與賦值運算子相結合而產生的一種運算子簡寫形式。具體符號和對應功能如下圖表所示:

第四章 运算符和表达式

 

 

§4.7.2 複合賦值表達式

在表達式中使用複合賦值運算子, 則該表達式稱爲複合賦值表達式。複合賦值表達式是通過先進行算術運算,然後再將運算結果賦值給變數自身。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int iNum = 10;
​
            iNum += 5;
            Console.WriteLine("+= iNum = {0}\n", iNum);
​
            iNum -= 5;
            Console.WriteLine("-= iNum = {0}\n", iNum);
​
            iNum *= 5;
            Console.WriteLine("*= iNum = {0}\n", iNum);
​
            iNum /= 5;
            Console.WriteLine("\\= iNum = {0}\n", iNum);
​
            iNum %= 3;
            Console.WriteLine("mod(iNum) = {0}\n", iNum);
​
            iNum <<= 2;
            Console.WriteLine(" <<= iNum = {0}\n", iNum);
​
            iNum >>= 2;
            Console.WriteLine(" >>= iNum = {0}\n", iNum);
​
            iNum &= 1;
            Console.WriteLine("&= iNum = {0}\n", iNum);
​
            iNum |= 2;
            Console.WriteLine("|= iNum = {0}\n", iNum);
​
            iNum ^= 3;
            Console.WriteLine("^= iNum = {0}\n", iNum);
        }
    }
}

§4.8 自增和自減運算子

C#語言中包含兩個特殊運算子:自增運算子【++】和自減運算子【—】。自增或自減運算子對變數的操作分別是變數自增1與自減1。

§4.9.1 自增運算子

自增運算子根據程式碼編寫時相對於運算元放置的位置,可分爲:前置自增與後置自增兩種。

eg:

++iNum;//前置自增
​
fNum++;//後置自增

注意:

前置自增,先進行自增運算,然後再使用增後的新值參與其他運算。

後置自增,先使用變數當前的值參與其他運算,然後再進行自增運算。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int m, n = 0;
​
            m = 1;
​
            m++;//2
​
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
​
            n = m++;//m:3 n:2
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
​
            n = ++m;//4, 4
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
        }
    }
}

§4.9.2 自減運算子

自減運算子根據程式碼編寫時相對於運算元放置的位置,可分爲:前置自減與後置自減兩種。

eg:

--dNum_1;//前置自減
​
dNum_2--;//後置自減

注意:

前置自減,先進行自減運算,然後再使用減後的新值參與其他運算。

後置自減,先使用變數當前的值參與其他運算,然後再進行自減運算。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int m, n = 0;
​
            m = 1;
​
            m++;//2
            Console.WriteLine("m = %d , n = %d\n", m, n);
​
            n = --m;
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
​
            n = m++;//m:3 n:2
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
​
            n = ++m;//4, 4
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
​
            m--;//4, 3
            Console.WriteLine("m = {0} , n = {1}\n", m, n);
        }
    }
}

§4.9 sizeof運算子

C#語言中不同數據型別在計算機記憶體中佔用不同大小的記憶體空間,爲獲取運算元在當前操作系統中所佔的位元組數(bytes)大小,可使用sizoof()運算子。

格式:

sizeof(運算元);

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            /* sizeof 運算子的範例 */
            Console.WriteLine("int 的大小是 {0}", sizeof(int));
            Console.WriteLine("short 的大小是 {0}", sizeof(short));
            Console.WriteLine("double 的大小是 {0}", sizeof(double));
        }
    }
}

§4.10 條件運算子

C#語言中,條件運算子屬於三目運算子,使用【?:】表示。通過條件運算子可對一個表達式的真假情況進行檢驗,然後根據檢驗結果返回另外兩個表達式中的一個。

格式:

表達式1 ?表達式2:表達式3;

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int iNum = 10;
​
            int result = (iNum > 20) ? (iNum + 10) : (iNum + 50);
            Console.WriteLine("result = {0}\n", result); //60
        }
    }
}

§4.11 is運算子

C#語言中,is運算子用於判斷物件是否爲某一型別。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int iNum = 10;
​
            Console.WriteLine("iNum is int? {0}", iNum is int);
        }
    }
}

§4.12 as運算子

C#語言中,as運算子用於強制型別轉換,即使轉換失敗也不會拋出異常。

eg:

// #region << 版 本 注 釋 >>
// /*----------------------------------------------------------------
// // Copyright (C) 2019 極客部落
// // 版權所有。 
// //
// // 檔名:Program.cs
// // 檔案功能描述:
// //
// // 
// // 建立者:GeekTribe
// // 時間:14:05
// //----------------------------------------------------------------*/
// #endregion
using System;
using System.IO;
​
namespace MSN
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Object obj = new StringReader("Hello");
​
            StringReader r = obj as StringReader;
        }
    }
}

§4.13 運算子優先順序和結合型

第四章 运算符和表达式