運算符
運算符分類
- 按照功能分類
- 算術運算符
- 關系運算符和邏輯運算符
- 按位運算符
- 運算符根據參與運算的操作數的個數分為
- 單目運算
- 單目運算:只有一個操作數
- 雙目運算
- 雙目運算:兩個操作數
- 三目運算
- 三目運算:C語言中唯一的一個,也稱為問好表達式
- 單目運算
運算符的優先級以及結合性
- C語言中,
運算符的運算優先級分為15級,1級最高,15級最低,在表達式中,優先級高的先于優先級低的進行運算,而在一個運算量兩側的運算符,優先級相同時,則按照運算符的結合性所規定的結合方向處理
優先級 | 運算符 | 名稱或含義 | 使用形式 | 結合方向 | 說明 |
---|---|---|---|---|---|
1 | [] | 數組下標 | 數組名[常量表達式] | 左到右 | |
() | 圓括號 | (表達式)/函數名(形參) | |||
. | 成員選擇(對象) | 對象.成員 | |||
-> | 成員選擇(指針) | 對象指針->成員名 | |||
2 | - | 負號運算符 | -表達式 | 右到左 | 單目運算符 |
(類型) | 強制類型轉換 | (數據類型)表達式 | |||
++ | 自增運算符 | ++變量名/變量名++ | 單目運算符 | ||
-- | 自減運算符 | --變量名/變量名-- | 單目運算符 | ||
* | 取值運算符 | *指針變量 | 單目運算符 | ||
& | 取地址運算符 | &變量名 | 單目運算符 | ||
! | 邏輯非運算符 | !表達式 | 單目運算符 | ||
~ | 按位取反運算符 | ~表達式 | 單目運算符 | ||
sizeof | 長度運算符 | sizeof(表達式) | 單目運算符 | ||
3 | / | 除 | 表達式/表達式 | 左到右 | 雙目運算符 |
* | 乘 | 表達式*表達式 | 雙目運算符 | ||
% | 取余(取模) | 整型表達式%整型表達式 | 雙目運算符 | ||
4 | + | 加 | 表達式+表達式 | 左到右 | 雙目運算符 |
- | 減 | 表達式-表達式 | 雙目運算符 | ||
5 | << | 左移 | 變量<<表達式 | 左到右 | 雙目運算符 |
>> | 右移 | 變量>>表達式 | 雙目運算符 | ||
6 | > | 大于 | 表達式>表達式 | 左到右 | 雙目運算符 |
>= | 大于等于 | 表達式>=表達式 | 雙目運算符 | ||
< | 小于 | 表達式<表達式 | 雙目運算符 | ||
<= | 小于等于 | 表達式<=表達式 | 雙目運算符 | ||
7 | == | 等于 | 表達式==表達式 | 左到右 | 雙目運算符 |
!= | 不等于 | 表達式!=表達式 | 左到右 | 雙目運算符 | |
8 | & | 按位與 | 表達式&表達式 | 左到右 | 雙目運算符 |
9 | ^ | 按位異或 | 表達式^表達式 | 左到右 | 雙目運算符 |
10 | 按位或 |
按位或 | 表達式 按位或 表達式 |
左到右 | 雙目運算符 |
11 | && | 邏輯與 | 表達式&&表達式 | 左到右 | 雙目運算符 |
12 | 或 |
邏輯或 | 表達式 或 表達式 |
左到右 | 雙目運算符 |
13 | ?: | 條件運算符 | 表達式1 ? 表達式2:表達式3 | 右到左 | 三目運算符 |
14 | = | 賦值運算符 | 變量=表達式 | 右到左 | |
/= | 除后賦值 | 變量/=表達式 | |||
*= | 乘后賦值 | 變量*=表達式 | |||
%= | 取模后賦值 | 變量$=表達式 | |||
+= | 加后賦值 | 變量+=表達式 | |||
-= | 減后賦值 | 變量-=表達式 | |||
<<= | 左移后賦值 | 變量<<=表達式 | |||
>>= | 右移后賦值 | 變量>>=表達式 | |||
&= | 按位與后賦值 | 變量&=表達式 | |||
^= | 按位異或后賦值 | 變量^=表達式 | |||
按位或后賦值 |
按位或后賦值 | 變量按位或后賦值 表達式 |
|||
15 | , | 逗號運算符 | 表達式,表達式..... | 左到右 | 從左向右順序運算 |
- 注意:`按位或 | ,邏輯或 | , 按位或后賦值 | = ` |
結合性
- C語言中各種運算符的結合性分為兩種,左結合性(自左至右)和右結合性(自右至左)
- 算術運算符的結合性是自左至右,即先左后右
- 自右至左的結合方向稱為“右結合性”
算術運算符
算術運算符有:
加+ 減- 乘* 除/ 取余%
整數除以整數,求出來的結果依然是整數
浮點型賦值給整型會損失小數部分
% 兩側必須都為整數
利用%求出來的余數是正數還是負數,由%左邊的被除數決定,被除數是正數,余數就是正數,反之則是負數
-
結合性優先級
-* / % 優先級大于 + -- 優先級相同則左結合計算
-
自動類型提升
- 算術運算符規定:只有相同類型的數據才可以進行運算
- 如果計算過程中,參與運算的操作數不是同一類型,那么系統會自動將小類型轉換為大類型,然后再進行計算
-
算術運算的注意點:
-
自動類型轉換:int a = 10.6
; -
自動將大類型轉換為小類型,會丟失精度,自動類型提升 int b = 10.5 + 10
; 將右邊的1 提升為double類型,double b = 1.0 / 2 ;解決除法的精度問題
-
強制類型轉換 double a = (double)1 / 2; 結果:a=0.500000; double b = (double)(1 / 2);結果:b=0.000000
; 如果取模運算左邊小于右邊,那么結果就是左邊的數
無論是隱式轉換還是顯式轉換,只要將一個大類型的數據,轉換為小類型的數據,那么就有可能丟失精度
-
類型轉換問題
-
類型轉換分為
- 隱式類型轉換
- 不同類型數據混合運算時,升級成數據類型較大的類型
- 賦值時右側表達式的值轉換成左側變量的類型
- 所有浮點運算都是以double類型進行計算,即使表達式中都是float
- 必定會發生的轉換
- char、short -> int
- float -> double
- 顯式類型轉換
- (類型關鍵字)(表達式)
- (int)8.8 / 4: 8.8先轉換為8 然后再除以4,結果是2
- 隱式類型轉換
自動轉換發生在不同數據類型的量混合運算時,由編譯器系統自動完成
-
自動類型轉換遵循以下規則:
- 相同的數據類型的值才能進行運算(比如加法運算),而且運算結果依然是同一種數據類型,系統會自動對占用內存較少的類型做一個自動類型提升的操作
- 若參與運算量的類型不同,先轉換成同一類型,然后進行運算
- 轉換按數據長度增加的方向進行,以保證精度不降低,如int類型和long類型運算時,先把int量轉換成long類型再進行計算
- 所有浮點型運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double類型再做運算
- char型和short型參與運算時,必須先轉換成int型
- 在賦值運算中,賦值號兩邊的數據類型不同時,賦值號右邊的量將轉換為左邊的量,如果右邊的量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失部分,按四舍五入
- char/short -> int ->unsigned -> long -> double
-
強制類型轉換:
- 將大范圍的數據賦值給小范圍的變量時,系統會自動做一個強制類型轉換的操作,這樣容易丟失精度
- 類型說明符和表達式都必須加括號(單個變量可以不加括號)
賦值運算符
簡單賦值運算符:=
復合賦值運算符:+=、-=、*=、/=、%=
最簡單的賦值運算:將等號右邊的值賦值給等號左邊的變量
-
復合賦值運算符
- /= 例如:a/=3; 相當于a = a / 3;
- *= 例如: a*=3; 相當于a = a * 3;
- %= 例如: a%=3; 相當于a = a % 3;
- += 例如: a+=3; 相當于a = a + 3;
- -= 例如: a-=3; 相當于a = a - 3;
自增、自減
- 前綴表達式:++x,--x:其中x表示變量名,先完成變量的自增自減1運算,再用x的值作為表達式的值,即
先變后用
,也就是變量的值先變,然后再用變量的值參與運算 - 后綴表達式:x++,x--:先用x的值為表達式的值,然后變量自增自減1,即
先用后變
,也就是先用變量的值進行運算,然后變量自增自減變換
sizeof運算符
sizeof可以用來計算一個變量或一個常量、一種數據類型所占用的內存字節數
格式:sizeof(變量/常量)
sizeof不是一個函數,是一個運算符
-
計算常量所占用字節數
- sizeof(10); 或者sizeof 10
計算變量占用的字節數
double doubleValue = 10.9;
int number = sizeof(doubleValue);
// 也可以省略括號
int number = sizeof doubleValue;
- 計算數據類型
sizeof計算數據類型,括號不能省略
int number = sizeof(char);
int number = sizeof(double);
逗號運算符
-
功能是將多個表達式連接起來組成一個表達式,稱為逗號表達式
- 格式:表達式1,表達式2,.....表達式n;
-
求值過程
- 逗號表達式從左往右以此計算各個表達式的值
- 整個逗號表達式的值是最后一個表達式的值
關系運算符
c語言中,條件成立稱為真,條件不成立稱為假
任何非0值都是真,只有0才是假
-
關系運算符有:
> 、>= 、< 、<= 、== 、 !=
- 關系運算符的結果只有兩種,條件成立結果為真,條件不成立結果為假
關系運算符優先級:
> < >= <= 優先級大于== !=
算術運算符優先級大于關系運算符
邏輯運算符
-
C語言提供了三種邏輯運算符
- && 與
- || 或
- ! 非
-
邏輯與(&&)
- 格式:表達式1 && 表達式2
- 只有表達式1和表達式2都為真的時候才是真,只要有一個是假,那么結果就是假
- 特點:
一假則假,如果表達式1是假,那么表達式2將不會計算
-
邏輯或(||)
- 格式:表達式1 || 表達式2
- 只要有一個是真,那么結果是真,只有兩個表達式都為假時,結果才是假
- 特點:
一真則真,如果表達式1是真,那么表達式2將不會計算
-
邏輯非 (!)
- 格式:!表達式
- 表達式是真,那么就是假,表達式是假,那么就是真
- 結合性:
從右至左
三目運算符
- 格式:條件表達式 ? 結果A : 結果B
- 結合性:從左往右
- 條件表達式為真,就返回結果A,否則返回結果B