運(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語(yǔ)言中唯一的一個(gè),也稱為問好表達(dá)式
- 單目運(yùn)算
運(yùn)算符的優(yōu)先級(jí)以及結(jié)合性
- C語(yǔ)言中,
運(yùn)算符的運(yùn)算優(yōu)先級(jí)分為15級(jí),1級(jí)最高,15級(jí)最低,在表達(dá)式中,優(yōu)先級(jí)高的先于優(yōu)先級(jí)低的進(jìn)行運(yùn)算,而在一個(gè)運(yùn)算量?jī)蓚?cè)的運(yùn)算符,優(yōu)先級(jí)相同時(shí),則按照運(yùn)算符的結(jié)合性所規(guī)定的結(jié)合方向處理
| 優(yōu)先級(jí) | 運(yùn)算符 | 名稱或含義 | 使用形式 | 結(jié)合方向 | 說(shuō)明 |
|---|---|---|---|---|---|
| 1 | [] | 數(shù)組下標(biāo) | 數(shù)組名[常量表達(dá)式] | 左到右 | |
| () | 圓括號(hào) | (表達(dá)式)/函數(shù)名(形參) | |||
| . | 成員選擇(對(duì)象) | 對(duì)象.成員 | |||
| -> | 成員選擇(指針) | 對(duì)象指針->成員名 | |||
| 2 | - | 負(fù)號(hào)運(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 | 長(zhǎng)度運(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 | , | 逗號(hào)運(yùn)算符 | 表達(dá)式,表達(dá)式..... | 左到右 | 從左向右順序運(yùn)算 |
| - 注意:`按位或 | ,邏輯或 | , 按位或后賦值 | = ` |
結(jié)合性
- C語(yǔ)言中各種運(yùn)算符的結(jié)合性分為兩種,左結(jié)合性(自左至右)和右結(jié)合性(自右至左)
- 算術(shù)運(yùn)算符的結(jié)合性是自左至右,即先左后右
- 自右至左的結(jié)合方向稱為“右結(jié)合性”
算術(shù)運(yùn)算符
算術(shù)運(yùn)算符有:
加+ 減- 乘* 除/ 取余%整數(shù)除以整數(shù),求出來(lái)的結(jié)果依然是整數(shù)
浮點(diǎn)型賦值給整型會(huì)損失小數(shù)部分
% 兩側(cè)必須都為整數(shù)
利用%求出來(lái)的余數(shù)是正數(shù)還是負(fù)數(shù),由%左邊的被除數(shù)決定,被除數(shù)是正數(shù),余數(shù)就是正數(shù),反之則是負(fù)數(shù)
-
結(jié)合性優(yōu)先級(jí)
-* / % 優(yōu)先級(jí)大于 + -- 優(yōu)先級(jí)相同則左結(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ù)無(wú)論是隱式轉(zhuǎn)換還是顯式轉(zhuǎn)換,只要將一個(gè)大類型的數(shù)據(jù),轉(zhuǎn)換為小類型的數(shù)據(jù),那么就有可能丟失精度
-
類型轉(zhuǎn)換問題
-
類型轉(zhuǎn)換分為
- 隱式類型轉(zhuǎn)換
- 不同類型數(shù)據(jù)混合運(yùn)算時(shí),升級(jí)成數(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)對(duì)占用內(nèi)存較少的類型做一個(gè)自動(dòng)類型提升的操作
- 若參與運(yùn)算量的類型不同,先轉(zhuǎn)換成同一類型,然后進(jìn)行運(yùn)算
- 轉(zhuǎn)換按數(shù)據(jù)長(zhǎng)度增加的方向進(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)算中,賦值號(hào)兩邊的數(shù)據(jù)類型不同時(shí),賦值號(hào)右邊的量將轉(zhuǎn)換為左邊的量,如果右邊的量的數(shù)據(jù)類型長(zhǎng)度比左邊長(zhǎng)時(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)換的操作,這樣容易丟失精度
- 類型說(shuō)明符和表達(dá)式都必須加括號(hào)(單個(gè)變量可以不加括號(hào))
賦值運(yùn)算符
簡(jiǎn)單賦值運(yùn)算符:=
復(fù)合賦值運(yùn)算符:+=、-=、*=、/=、%=
最簡(jiǎn)單的賦值運(yùn)算:將等號(hào)右邊的值賦值給等號(hào)左邊的變量
-
復(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可以用來(lái)計(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);
// 也可以省略括號(hào)
int number = sizeof doubleValue;
- 計(jì)算數(shù)據(jù)類型
sizeof計(jì)算數(shù)據(jù)類型,括號(hào)不能省略
int number = sizeof(char);
int number = sizeof(double);
逗號(hào)運(yùn)算符
-
功能是將多個(gè)表達(dá)式連接起來(lái)組成一個(gè)表達(dá)式,稱為逗號(hào)表達(dá)式
- 格式:表達(dá)式1,表達(dá)式2,.....表達(dá)式n;
-
求值過程
- 逗號(hào)表達(dá)式從左往右以此計(jì)算各個(gè)表達(dá)式的值
- 整個(gè)逗號(hào)表達(dá)式的值是最后一個(gè)表達(dá)式的值
關(guān)系運(yùn)算符
c語(yǔ)言中,條件成立稱為真,條件不成立稱為假
任何非0值都是真,只有0才是假
-
關(guān)系運(yùn)算符有:
> 、>= 、< 、<= 、== 、 !=- 關(guān)系運(yùn)算符的結(jié)果只有兩種,條件成立結(jié)果為真,條件不成立結(jié)果為假
關(guān)系運(yùn)算符優(yōu)先級(jí):
> < >= <= 優(yōu)先級(jí)大于== !=算術(shù)運(yùn)算符優(yōu)先級(jí)大于關(guān)系運(yùn)算符
邏輯運(yùn)算符
-
C語(yǔ)言提供了三種邏輯運(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