C 基礎知識之3 C 中的運算子

2021-07-26 10:14:14 字數 4249 閱讀 1196

運算子是一種告訴編譯器執行特定的數學或者邏輯操作的符號。c++內建了豐富的運算子。和運算子相關的概念和知識也是c++程式語言中的重要組成部分。這裡做乙個初步總結。

主要分為如下五種型別的運算子。

算術運算子

包括加法運算子(+)、減法運算子(-)、乘法運算子(*)、除法運算子(/)、取模運算子(%)、自增運算子(++)和自減運算子(- -)。其中需要注意的是字首自增(++a)和字尾自增(a++)的區別。前者表示先執行自增運算,執行完的結果參與其它運算;而後者表示先對a執行其它運算,等到表示式中和a相關的語句執行完成之後,再對a進行自增。除非過載,算術運算子的運算結果一般為數值。

關係運算子

包括相等運算子(==),不等運算子(!=),大於運算子(>),小於運算子(<),大於等於運算子(>=)以及小於等於運算子(<=)。除非過載,關係運算子的運算結果一般為布林值。

邏輯運算子

包括邏輯與運算子(&&)、邏輯或運算子(||)和邏輯非運算子(!)。其中邏輯與和邏輯或運算在c++中採用短路實現,即對於(a&&b),假如已經運算得知a為false,則不再對b進行運算,直接返回結果false;對於(a||b),假如已經運算得知a為true,則不再對b進行運算,直接返回true。

位運算子

位運算子作用於二進位制位,並逐位執行操作。假設a=60=0b00111100, b=13=0b00001101,則位運算的描述如下:

運算子例項解釋&

(a&b)=0b00001100=12

當且僅當兩個運算元的對應位都為1時結果才為1

|(a|b)=0b00111101=61

只要有乙個運算元的對應位為1則結果為1

^(a^b)=0b00110001=49

當且僅當兩個運算元的對應位不同時結果為1

~(~a)=0b11000011=-61

各位取反

<<

(a<<2)=240

左運算元的值向左移動右運算元指定的位數,右邊補零

>>

(a>>2)=15

左運算元的值向右移動右運算元指定的位數,左邊補零

賦值運算子

賦值運算子其實就是等號(=)以及它與所有算術運算子和位運算子的結合。例如a+=b就等同於a = a + b。賦值運算子可以起到簡化**的作用。c++支援的賦值運算子主要包括:簡單賦值運算子(=)、加賦值運算子(+=)、減賦值運算子(-=)、乘賦值運算子(*=)、除賦值運算子(/=)、求模賦值運算子(%=)、左移賦值運算子(<<=)、右移賦值運算子(>>=)、按位與賦值運算子(&=)、按位或賦值運算子(|=)以及按位異或(^=)賦值運算子。

雜項運算子

c++中的其它重要的運算子如下:

運算子描述

sizeof

sizeof運算子返回變數的大小,以位元組為單位。例如sizeof(short) == 2。

condition?x:y

條件運算子,如果condition為真則返回x,否則返回y。

,逗號運算子會順序執行一系列運算,整個逗號表示式的值是以逗號分隔的列表中的最後乙個表示式的值。

.和->

成員運算子用於引用類、結構和共用體的成員,其中前者適用於普通變數或者引用型別,後者適用於指標型別。

cast

強制轉換運算子把一種資料型別轉換為另一種資料型別,例如int(6.5)=6。

&取位址運算子&返回變數的位址;如果出現在左值中則表示後面的變數型別為引用。

*取內容運算子*返回指標所指向的內容;如果出現在左值中則表示後面的變數型別為指標。

運算子的優先順序確定表示式中各項的組合順序。明確定義運算子的優先順序可以大量減少括弧的使用,提高**的可讀性。下表將按照運算子優先順序從高到低列出各個運算子,具有較高優先順序的預算付出現在**的上面。在表示式中,較高優先順序的運算子會優先被計算。

優先順序操作符

說明結合方向1::

範圍解析

從左到右

2() . -> ++ - - dynamic_cast static_cast reinterpret_cast const_cast typeid

字尾從左到右

3++ - - ~ ! sizeof new delete

一元(字首)

從右到左

* &指標和取位址

+ -一元符號

4(type)

型別轉換

從右到左

5.* ->*

指向成員的指標

從左到右

6* / %

乘除及取模

從左到右

7+ -

加減從左到右

8<< >>

位移從左到右

9< > <= >=

關係操作符

從左到右

10== !=

相等判定

從左到右11&

按位與運算

從左到右12^

按位異或運算

從左到右13|

按位或運算

從左到右

14&&

邏輯與運算

從左到右

15||

邏輯或操作

從左到右

16?:

條件運算

從右到左

17= += -= *= /= %= >>= <<= &= ^= |=

賦值運算

從右到左18,

逗號從左到右

事實上上表也無須死記硬背,很多運算子的規則和數學中是相同的。用的多,看得多了自然就記得了。對於拿不準的,可以通過使用括弧達到目標。

運算子過載允許把標準運算子應用於自定義資料型別的物件,直觀自然,可以提高程式的可讀性,體現了c++的可擴充套件性。運算子過載本質上是函式的過載,但不同之處在於運算子過載的一定是操作符。

過載的實現方式

運算子過載的實現方式有兩種,即通過「友元函式」或者「類成員函式」,這兩種方式都可以訪問類中的私有成員。下面是友元函式操作符過載方式。

class 類名 ;

// 類外定義格式

返回型別 operator 操作符(形參表)

下面是類成員函式操作符過載的方式。

class 類名 ;

// 類外定義格式

返回型別 類名 :: operator 操作符(形參表)

利用友元函式過載二元操作符時,形式引數是兩個,而利用類成員函式時,形式引數卻只有乙個。這是因為類成員函式中存在this指標,這相當於乙個引數,所以類成員實現操作符過載需要的形式引數比原來少乙個。這比如利用類成員函式實現一元操作符」-「時,就不需要引數了。也正是因為這個原因,友元函式實現的操作符過載是有限制的,比如,(),->和=等不能利用友元函式實現運算子的過載。

在實際開發過程中,單目運算子建議過載為成員函式,而雙目運算子建議過載為友元函式。通常情況下雙目運算子過載為友元函式比重載為成員函式更方便,但是有時候雙目運算子比如過載為成員函式,例如賦值運算子=。還有如果需要修改物件內部的狀態,一般也可以選擇利用類成員函式的過載進行修改。

運算子過載的原則

運算子過載也是要遵循一些原則的:

1. c++中只能對已有的運算子進行過載(見本貼的基本運算子介紹),不允許使用者自己定義新的運算子。

2. c++中絕大多數運算子可以過載,但是有五個運算子不允許過載,分別是:成員訪問運算子(.),作用域運算子(::),長度運算子(sizeof),條件運算子(?:)以及成員指標訪問運算子(.*)。

3. 運算子過載後不能改變運算子的操作物件(運算元)的個數。如:」+」是實現兩個運算元的運算子,過載後仍然為雙目運算子。

4. 過載不能改變運算子原有的優先順序和原有的結合性。

5. 運算子過載不能全部是c++中預定義的基本資料,這樣做的目的是為了防止使用者修改用於基本型別資料的運算子性質。

6. 對於前置單目運算子u,如「-」(負號)等,如果要過載u為類的成員函式,用來實現表示式u oprd,其中oprd為a類的物件,則u應當過載為a類的成員函式,函式沒有形參。經過過載之後,表示式u oprd相當於函式呼叫oprd.operator u()。

7. 對於後置運算子「++」和「- -」,如果要將它們過載為類的成員函式,用來實現表示式oprd++或oprd- -,其中oprd為a類的物件,那麼運算子就應當過載為a類的成員函式,這時函式要帶有乙個整型形參。過載之後,表示式oprd++和oprd- - 就想當於函式呼叫oprd.operator++(0)和oprd.operator- -(0)。

C 運算子基礎知識

注意1 整數除整數還是整數 去除小數部分 注意2 除數不能為0 運算子意義 取模 取餘 10 3 1 10 20 10 注意1 取模不能為0 注意2 兩個小數不能做取模運算 運算子 術語示例 前置遞增 讓變數 1 a 2 b a 後置遞增 讓變數 1 a 2 b a 前置和後置的區別 前置遞增 先讓...

c 基礎知識 運算子的過載

下面的程式演示了完整的實現 using system namespace public void setlength double len public void setbreadth double bre public void setheight double hei 過載 運算子來把兩個 bo...

Python 基礎知識3 運算子

python運算子 a 21 b 10 c 0 c a print c c a print c c a print c c 2 c 3 取c的三次方 print c c 2 c a 取餘 print c c a 向下取整 print c 位運算 a 0b00111100 b 0b00001101 p...