運(yùn)算符
運(yùn)算符分類
- 按照功能分類
- 算術(shù)運(yùn)算符
- 關(guān)系運(yùn)算符和邏輯運(yùn)算符
- 按位運(yùn)算符
- 運(yùn)算符根據(jù)參與運(yùn)算的操作數(shù)的個(gè)數(shù)分為
- 單目運(yùn)算
- 單目運(yùn)算:只有一個(gè)操作數(shù)
- 雙目運(yùn)算
- 雙目運(yùn)算:兩個(gè)操作數(shù)
- 三目運(yùn)算
- 三目運(yùn)算:C語言中唯一的一個(gè)预侯,也稱為問好表達(dá)式
- 單目運(yùn)算
運(yùn)算符的優(yōu)先級以及結(jié)合性
- C語言中,
運(yùn)算符的運(yùn)算優(yōu)先級分為15級妇菱,1級最高暴区,15級最低辛臊,在表達(dá)式中,優(yōu)先級高的先于優(yōu)先級低的進(jìn)行運(yùn)算伐割,而在一個(gè)運(yùn)算量兩側(cè)的運(yùn)算符刃唤,優(yōu)先級相同時(shí)尚胞,則按照運(yùn)算符的結(jié)合性所規(guī)定的結(jié)合方向處理
優(yōu)先級 | 運(yùn)算符 | 名稱或含義 | 使用形式 | 結(jié)合方向 | 說明 |
---|---|---|---|---|---|
1 | [] | 數(shù)組下標(biāo) | 數(shù)組名[常量表達(dá)式] | 左到右 | |
() | 圓括號 | (表達(dá)式)/函數(shù)名(形參) | |||
. | 成員選擇(對象) | 對象.成員 | |||
-> | 成員選擇(指針) | 對象指針->成員名 | |||
2 | - | 負(fù)號運(yùn)算符 | -表達(dá)式 | 右到左 | 單目運(yùn)算符 |
(類型) | 強(qiáng)制類型轉(zhuǎn)換 | (數(shù)據(jù)類型)表達(dá)式 | |||
++ | 自增運(yùn)算符 | ++變量名/變量名++ | 單目運(yùn)算符 | ||
-- | 自減運(yùn)算符 | --變量名/變量名-- | 單目運(yùn)算符 | ||
* | 取值運(yùn)算符 | *指針變量 | 單目運(yùn)算符 | ||
& | 取地址運(yùn)算符 | &變量名 | 單目運(yùn)算符 | ||
笼裳! | 邏輯非運(yùn)算符 | !表達(dá)式 | 單目運(yùn)算符 | ||
~ | 按位取反運(yùn)算符 | ~表達(dá)式 | 單目運(yùn)算符 | ||
sizeof | 長度運(yùn)算符 | sizeof(表達(dá)式) | 單目運(yùn)算符 | ||
3 | / | 除 | 表達(dá)式/表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
* | 乘 | 表達(dá)式*表達(dá)式 | 雙目運(yùn)算符 | ||
% | 取余(取模) | 整型表達(dá)式%整型表達(dá)式 | 雙目運(yùn)算符 | ||
4 | + | 加 | 表達(dá)式+表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
- | 減 | 表達(dá)式-表達(dá)式 | 雙目運(yùn)算符 | ||
5 | << | 左移 | 變量<<表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
>> | 右移 | 變量>>表達(dá)式 | 雙目運(yùn)算符 | ||
6 | > | 大于 | 表達(dá)式>表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
>= | 大于等于 | 表達(dá)式>=表達(dá)式 | 雙目運(yùn)算符 | ||
< | 小于 | 表達(dá)式<表達(dá)式 | 雙目運(yùn)算符 | ||
<= | 小于等于 | 表達(dá)式<=表達(dá)式 | 雙目運(yùn)算符 | ||
7 | == | 等于 | 表達(dá)式==表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
!= | 不等于 | 表達(dá)式!=表達(dá)式 | 左到右 | 雙目運(yùn)算符 | |
8 | & | 按位與 | 表達(dá)式&表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
9 | ^ | 按位異或 | 表達(dá)式^表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
10 | 按位或 |
按位或 | 表達(dá)式 按位或 表達(dá)式 |
左到右 | 雙目運(yùn)算符 |
11 | && | 邏輯與 | 表達(dá)式&&表達(dá)式 | 左到右 | 雙目運(yùn)算符 |
12 | 或 |
邏輯或 | 表達(dá)式 或 表達(dá)式 |
左到右 | 雙目運(yùn)算符 |
13 | ?: | 條件運(yùn)算符 | 表達(dá)式1 橄碾? 表達(dá)式2:表達(dá)式3 | 右到左 | 三目運(yùn)算符 |
14 | = | 賦值運(yùn)算符 | 變量=表達(dá)式 | 右到左 | |
/= | 除后賦值 | 變量/=表達(dá)式 | |||
*= | 乘后賦值 | 變量*=表達(dá)式 | |||
%= | 取模后賦值 | 變量$=表達(dá)式 | |||
+= | 加后賦值 | 變量+=表達(dá)式 | |||
-= | 減后賦值 | 變量-=表達(dá)式 | |||
<<= | 左移后賦值 | 變量<<=表達(dá)式 | |||
>>= | 右移后賦值 | 變量>>=表達(dá)式 | |||
&= | 按位與后賦值 | 變量&=表達(dá)式 | |||
^= | 按位異或后賦值 | 變量^=表達(dá)式 | |||
按位或后賦值 |
按位或后賦值 | 變量按位或后賦值 表達(dá)式 |
|||
15 | , | 逗號運(yùn)算符 | 表達(dá)式,表達(dá)式..... | 左到右 | 從左向右順序運(yùn)算 |
- 注意:`按位或 | 法牲,邏輯或 | , 按位或后賦值 | = ` |
結(jié)合性
- C語言中各種運(yùn)算符的結(jié)合性分為兩種淹办,左結(jié)合性(自左至右)和右結(jié)合性(自右至左)
- 算術(shù)運(yùn)算符的結(jié)合性是自左至右恶复,即先左后右
- 自右至左的結(jié)合方向稱為“右結(jié)合性”
算術(shù)運(yùn)算符
算術(shù)運(yùn)算符有:
加+ 減- 乘* 除/ 取余%
整數(shù)除以整數(shù)谤牡,求出來的結(jié)果依然是整數(shù)
浮點(diǎn)型賦值給整型會(huì)損失小數(shù)部分
% 兩側(cè)必須都為整數(shù)
利用%求出來的余數(shù)是正數(shù)還是負(fù)數(shù)副硅,由%左邊的被除數(shù)決定翅萤,被除數(shù)是正數(shù),余數(shù)就是正數(shù)培己,反之則是負(fù)數(shù)
-
結(jié)合性優(yōu)先級
-* / % 優(yōu)先級大于 + -- 優(yōu)先級相同則左結(jié)合計(jì)算
-
自動(dòng)類型提升
- 算術(shù)運(yùn)算符規(guī)定:只有相同類型的數(shù)據(jù)才可以進(jìn)行運(yùn)算
- 如果計(jì)算過程中胚泌,參與運(yùn)算的操作數(shù)不是同一類型,那么系統(tǒng)會(huì)自動(dòng)將小類型轉(zhuǎn)換為大類型玷室,然后再進(jìn)行計(jì)算
-
算術(shù)運(yùn)算的注意點(diǎn):
-
自動(dòng)類型轉(zhuǎn)換:int a = 10.6
; -
自動(dòng)將大類型轉(zhuǎn)換為小類型,會(huì)丟失精度敌蜂,自動(dòng)類型提升 int b = 10.5 + 10
; 將右邊的1 提升為double類型津肛,double b = 1.0 / 2 ;解決除法的精度問題
-
強(qiáng)制類型轉(zhuǎn)換 double a = (double)1 / 2; 結(jié)果:a=0.500000; double b = (double)(1 / 2);結(jié)果:b=0.000000
; 如果取模運(yùn)算左邊小于右邊,那么結(jié)果就是左邊的數(shù)
無論是隱式轉(zhuǎn)換還是顯式轉(zhuǎn)換囊陡,只要將一個(gè)大類型的數(shù)據(jù)撞反,轉(zhuǎn)換為小類型的數(shù)據(jù),那么就有可能丟失精度
-
類型轉(zhuǎn)換問題
-
類型轉(zhuǎn)換分為
- 隱式類型轉(zhuǎn)換
- 不同類型數(shù)據(jù)混合運(yùn)算時(shí)嘹害,升級成數(shù)據(jù)類型較大的類型
- 賦值時(shí)右側(cè)表達(dá)式的值轉(zhuǎn)換成左側(cè)變量的類型
- 所有浮點(diǎn)運(yùn)算都是以double類型進(jìn)行計(jì)算吮便,即使表達(dá)式中都是float
- 必定會(huì)發(fā)生的轉(zhuǎn)換
- char、short -> int
- float -> double
- 顯式類型轉(zhuǎn)換
- (類型關(guān)鍵字)(表達(dá)式)
- (int)8.8 / 4: 8.8先轉(zhuǎn)換為8 然后再除以4许师,結(jié)果是2
- 隱式類型轉(zhuǎn)換
自動(dòng)轉(zhuǎn)換發(fā)生在不同數(shù)據(jù)類型的量混合運(yùn)算時(shí)僚匆,由編譯器系統(tǒng)自動(dòng)完成
-
自動(dòng)類型轉(zhuǎn)換遵循以下規(guī)則:
- 相同的數(shù)據(jù)類型的值才能進(jìn)行運(yùn)算(比如加法運(yùn)算)咧擂,而且運(yùn)算結(jié)果依然是同一種數(shù)據(jù)類型,系統(tǒng)會(huì)自動(dòng)對占用內(nèi)存較少的類型做一個(gè)自動(dòng)類型提升的操作
- 若參與運(yùn)算量的類型不同云芦,先轉(zhuǎn)換成同一類型贸桶,然后進(jìn)行運(yùn)算
- 轉(zhuǎn)換按數(shù)據(jù)長度增加的方向進(jìn)行,以保證精度不降低堡赔,如int類型和long類型運(yùn)算時(shí)设联,先把int量轉(zhuǎn)換成long類型再進(jìn)行計(jì)算
- 所有浮點(diǎn)型運(yùn)算都是以雙精度進(jìn)行的灼捂,即使僅含float單精度量運(yùn)算的表達(dá)式悉稠,也要先轉(zhuǎn)換成double類型再做運(yùn)算
- char型和short型參與運(yùn)算時(shí),必須先轉(zhuǎn)換成int型
- 在賦值運(yùn)算中,賦值號兩邊的數(shù)據(jù)類型不同時(shí)想虎,賦值號右邊的量將轉(zhuǎn)換為左邊的量,如果右邊的量的數(shù)據(jù)類型長度比左邊長時(shí)叛拷,將丟失一部分?jǐn)?shù)據(jù)忿薇,這樣會(huì)降低精度,丟失部分揉燃,按四舍五入
- char/short -> int ->unsigned -> long -> double
-
強(qiáng)制類型轉(zhuǎn)換:
- 將大范圍的數(shù)據(jù)賦值給小范圍的變量時(shí)筋栋,系統(tǒng)會(huì)自動(dòng)做一個(gè)強(qiáng)制類型轉(zhuǎn)換的操作,這樣容易丟失精度
- 類型說明符和表達(dá)式都必須加括號(單個(gè)變量可以不加括號)
賦值運(yùn)算符
簡單賦值運(yùn)算符:=
復(fù)合賦值運(yùn)算符:+=婿崭、-=肴颊、*=婿着、/=、%=
最簡單的賦值運(yùn)算:將等號右邊的值賦值給等號左邊的變量
-
復(fù)合賦值運(yùn)算符
- /= 例如:a/=3; 相當(dāng)于a = a / 3;
- *= 例如: a*=3; 相當(dāng)于a = a * 3;
- %= 例如: a%=3; 相當(dāng)于a = a % 3;
- += 例如: a+=3; 相當(dāng)于a = a + 3;
- -= 例如: a-=3; 相當(dāng)于a = a - 3;
自增提完、自減
- 前綴表達(dá)式:++x丘侠,--x:其中x表示變量名,先完成變量的自增自減1運(yùn)算打肝,再用x的值作為表達(dá)式的值挪捕,即
先變后用
级零,也就是變量的值先變,然后再用變量的值參與運(yùn)算 - 后綴表達(dá)式:x++,x--:先用x的值為表達(dá)式的值鉴嗤,然后變量自增自減1,即
先用后變
醉锅,也就是先用變量的值進(jìn)行運(yùn)算荣挨,然后變量自增自減變換
sizeof運(yùn)算符
sizeof可以用來計(jì)算一個(gè)變量或一個(gè)常量、一種數(shù)據(jù)類型所占用的內(nèi)存字節(jié)數(shù)
格式:sizeof(變量/常量)
sizeof不是一個(gè)函數(shù)此虑,是一個(gè)運(yùn)算符
-
計(jì)算常量所占用字節(jié)數(shù)
- sizeof(10); 或者sizeof 10
計(jì)算變量占用的字節(jié)數(shù)
double doubleValue = 10.9;
int number = sizeof(doubleValue);
// 也可以省略括號
int number = sizeof doubleValue;
- 計(jì)算數(shù)據(jù)類型
sizeof計(jì)算數(shù)據(jù)類型口锭,括號不能省略
int number = sizeof(char);
int number = sizeof(double);
逗號運(yùn)算符
-
功能是將多個(gè)表達(dá)式連接起來組成一個(gè)表達(dá)式鹃操,稱為逗號表達(dá)式
- 格式:表達(dá)式1,表達(dá)式2荆隘,.....表達(dá)式n椰拒;
-
求值過程
- 逗號表達(dá)式從左往右以此計(jì)算各個(gè)表達(dá)式的值
- 整個(gè)逗號表達(dá)式的值是最后一個(gè)表達(dá)式的值
關(guān)系運(yùn)算符
c語言中,條件成立稱為真褒脯,條件不成立稱為假
任何非0值都是真缆毁,只有0才是假
-
關(guān)系運(yùn)算符有:
> 、>= 颁督、< 缚陷、<= 箫爷、== 、 !=
- 關(guān)系運(yùn)算符的結(jié)果只有兩種硫痰,條件成立結(jié)果為真窜护,條件不成立結(jié)果為假
關(guān)系運(yùn)算符優(yōu)先級:
> < >= <= 優(yōu)先級大于== !=
算術(shù)運(yùn)算符優(yōu)先級大于關(guān)系運(yùn)算符
邏輯運(yùn)算符
-
C語言提供了三種邏輯運(yùn)算符
- && 與
- || 或
- ! 非
-
邏輯與(&&)
- 格式:表達(dá)式1 && 表達(dá)式2
- 只有表達(dá)式1和表達(dá)式2都為真的時(shí)候才是真,只要有一個(gè)是假缓屠,那么結(jié)果就是假
- 特點(diǎn):
一假則假护侮,如果表達(dá)式1是假羊初,那么表達(dá)式2將不會(huì)計(jì)算
-
邏輯或(||)
- 格式:表達(dá)式1 || 表達(dá)式2
- 只要有一個(gè)是真,那么結(jié)果是真晦攒,只有兩個(gè)表達(dá)式都為假時(shí)得哆,結(jié)果才是假
- 特點(diǎn):
一真則真,如果表達(dá)式1是真栋操,那么表達(dá)式2將不會(huì)計(jì)算
-
邏輯非 (!)
- 格式:!表達(dá)式
- 表達(dá)式是真乐设,那么就是假近尚,表達(dá)式是假,那么就是真
- 結(jié)合性:
從右至左
三目運(yùn)算符
- 格式:條件表達(dá)式 歼跟? 結(jié)果A : 結(jié)果B
- 結(jié)合性:從左往右
- 條件表達(dá)式為真格遭,就返回結(jié)果A,否則返回結(jié)果B