運算符

運算符

運算符分類
  • 按照功能分類
    • 算術運算符
    • 關系運算符和邏輯運算符
    • 按位運算符
  • 運算符根據參與運算的操作數的個數分為
    • 單目運算
      • 單目運算:只有一個操作數
    • 雙目運算
      • 雙目運算:兩個操作數
    • 三目運算
      • 三目運算: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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容

  • C++運算符重載-上篇 本章內容:1. 運算符重載的概述2. 重載算術運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 2,317評論 0 51
  • 謹記 當你還在原地停留不動時,你的敵人已經前進一大步了;當你還沉浸在成功的喜悅中,你的對手又更上一層樓了;當你還在...
    長風留言閱讀 1,780評論 2 5
  • C++運算符重載-下篇 本章內容:1. 運算符重載的概述2. 重載算術運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 1,457評論 0 49
  • 表達式和運算符 程序中最簡單的表達式就是,程序中的常量 變量名也是一種簡單的表達式 復雜的表達式是由簡單的表達式組...
    zhaolion閱讀 1,649評論 3 12
  • Method Swizzling原理每個類都維護一個方法(Method)列表,Method則包含SEL和其對應IM...
    monk閱讀 242評論 0 0