小碼哥第三天筆記

運算符的概念以及分類

本小節知識點:

  1. 【瞭解】運算符基本概念
  2. 【理解】運算符分類

1.運算符基本概念

  • 運算符是告訴編譯程序執行特定算術或邏輯操作的符號。
    • 例如告訴程序, 某兩個數相加, 相減等


2.運算符分類

  • 按照功能劃分:

    • 算術運算符
    • 關係運算符與邏輯運算符
    • 按位運算符
  • 運算符根據參與運算的操作數的個數分爲

    • 單目運算
      • 單目運算:只有一個操作數 如 : i++ ! sizeof
    • 雙目運算
      • 雙目運算:有兩個操作數 如 : a+b
    • 三目運算
      • 三目預算:C語言中唯一的一個,也稱爲問號表達式 a>b ? 1 : 0


運算符的優先級以及結合性

本小節知識點:

  1. 【理解】優先級
  2. 【理解】結合性

1.優先級

  • C語言中,運算符的運算優先級共分爲15 級。1 級最高,15 級最低。 在表達式中,優先級較高的先於優先級較低的進行運算。而在一個運算量兩側的運算符優先級相同時,則按運算符的 結合性所規定的結合方向處理。

江哥提示:一般情況下不需要死記硬背優先級, 只需要記住()優先級最高即可


2.結合性

  • C語言中各運算符的結合性分爲兩種,即左結合性(自左至右)和右結合性(自右至左)。

    • 算術運算符的結合性是自左至右,即先左後右。

      例如表達式: x-y+z
      則y 應先與“-”號結合,執行 x-y 運算,然後再執行+z 的運算。這種自左至右的結合 方向就稱爲“左結合性”。
      
    • 而自右至左 的結合方向稱爲“右結合性”。

      最典型的右結合 性運算符是賦值運算符例如:如x=y=z
      由於“=”的 右結合性,應先執行y=z 再執行x=(y=z)運算。

算術運算符

本小節知識點:

  1. 【理解】算術運算符
  2. 【掌握】結合性和優先級
  3. 【掌握】算術運算的注意點

1.算術運算符

名稱 符號 說明
加法運算符 + 雙目運算符,即應有兩個量參與加法運算。如a+b,4+8等。具有左結合性。
減法運算符 - 雙目運算符。但“-”也可作負值運算符,此時爲單目運算,如-x,-5等具有左結合 性。
乘法運算符 * 雙目運算符,具有左結合性。
除法運算符 / 雙目運算符,具有左結合性。參與運算量均爲整型時,結果也爲整型,捨去小數。如果運算量中有一個是實型,則結果爲雙精度實型
求餘運算符 (模運算符) % 雙目運算符,具有左結合性。要求參與運算的量均爲整型,不能應用於float或double 類型。求餘運算的結果等於兩數相除後的餘數,整除時結果爲0。
  • 整數除於整數,求出來的結果依然是整數
  • 浮點型賦值給整型會損失小數部分
  • %兩側必須都爲整數
  • 利用%求出來的餘數是正數還是負數,由%左邊的被除數決定,被除數是正數,餘數就是正數,反之則反

2.結合性和優先級

  • 結合性:從左到右
  • 優先級:
    • * / % 優先級 大於 + -
    • 優先級相同則左結合計算
      3*5/3+18
      先算3*5
      然後再算除3
      最後結果再+18
      

3.算術運算的注意點

  • 1.自動類型轉換

    int a = 10.6;
    int b = 10.5 + 1.7;
    
  • 2.自動將大類型轉換爲了小類型,會丟失精度 自動類型提升

    int b = 10.5 + 10;
    
  • 3.將右邊的1提升爲了double類型

    double b = 1.0 / 2;
    解決除法的精度問題
    
  • 4.強制類型轉換

    double a = (double)1 / 2;
    double b = (double)(1 / 2);// 錯誤寫法

求餘運算符

  1. 【理解】求餘運算注意事項

1.求餘運算注意事項

  • 參與運算的必須是整數
10 % 2 = 0
因爲 10 可以被2整除, 沒有餘數

10 % 3 = 1
因爲 10除以3餘1, 所以結果爲1
  • 錯誤寫法
12.3 % 3
  • 注意
  • m%n 求餘,相當於m/n 獲取餘數

    • (1)n等於0 無意義
    • (2)m等於0 結果爲0
    • (3)m>n 正常求餘 如:8 % 3 = 2
    • (4)m<n 結果是m 如:2 % 4 = 2 1 % 4 = 1 3 % 8=3
  • 運算結果的正負性取決於第一個運算數,跟後面的運算數無關

    10 % 3 = 1
    -10 % 3 = -1
    10 % -3 = 1

類型轉換問題

本小節知識點:

  1. 【掌握】算術運算中的類型轉換

1.類型轉換問題

  • 類型轉換分爲:
    • 隱式數據類型轉換
    • 顯示數據類型轉換

  • 自動轉換(隱式轉換):
  • 自動轉換髮生在不同數據類型的量混合運算時,由編譯系統自動完成。
  • 自動轉換遵循以下規則:
    • 相同數據類型的值才能進行運算(比如加法運算),而且運算結果依然是同一種數據類型。系統會自動對佔用內存較少的類型做一個“自動類型提升”的操作
    • 若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。
    • 轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉 成long型後再進行運算。
    • 所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成 double型,再作運算。
    • char型和short型參與運算時,必須先轉換成int型。
    • 在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換爲左邊量的類型。如果右邊量的數據類型長度比左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分 按四捨五入向前舍入。
double
  ↑
 long
  ↑
unsigned
  ↑
 int
  ↑
char|short
例如:
int i = 1;
i = i + 8.808
printf("%d", i);
輸出結果: 9

按照隱式處理方式,在處理i = i + 8.808時
首先i轉換爲double型,然後進行相加,結果爲double 型,再將double型轉換爲整型賦給i
  • 強制類型轉換(顯示轉換):
  • 強制類型轉換是通過類型轉換運算來實現的
    • 其一般形式爲:(類型說明符) (表達式)
      (float) a; /* 把a轉換爲實型 */
      (int)(x+y); /* 把x+y的結果轉換爲整型 */
      
int i = 1;
i = i + (int)8.808
printf("%d", i);
輸出結果: 9
這時直接將8.808轉換成整型,然後與i相加,再把結果賦給i。

其實: 這樣可把二次轉換簡化爲一次轉換。
int i = 1;
i = (int)(i + 8.808)
printf("%d", i);

或者讓系統隱式轉換
int i = 1;
i = i + 8.808
printf("%d", i);
  • 強制類型轉換注意點
    • 將大範圍的數據賦值給小範圍變量時,系統會自動做一個強制類型轉換的操作,這樣容易丟失精度
    • 類型說明符和表達式都必須加括號(單個變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。
    • 無論是強制轉換或是自動轉換,都只是爲了本次運算的需要而對變量的數據長度進行的臨時性轉換,而不改變數據說明時對該變量定義的類型。
float floatValue = 10.1f;
int sum = 4 + (int)floatValue ;
printf("sum = %d", sum);// 輸出14
//  floatValue本身的值並沒有改變
printf("floatValue = %f", floatValue); // 輸出10.100000

賦值運算符

本小節知識點:

  1. 【掌握】賦值運算符
  2. 【理解】賦值表達式及賦值語句

1.賦值運算符

+ 簡單賦值運算符: =
+ 複合賦值運算符: +=、-=、*=、/=、%=

2.賦值表達式

  • 什麼是表達式?

    • 將同類型的數據(如常量、變量、函數等),用運算符號按一定的規則連接起來的、有意義 的式子稱爲表達式。
    • 例如:算術表達式、邏輯表達式、字符表達式等。
  • 表達式的特點:

    • 表達式是一個意義的式子,所以一定有返回值

  • 賦值表達式
    • 由“=”連接的式子稱爲賦值表達式。
      • 例如: x = a + b;
        • 等號=左邊只能是變量,不能是常量,下面的寫法是錯誤的:10 = 10 + 5;
    • 凡是表達式可以出現的地方均可出現賦值表達式
  • 賦值運算符的結合性
    • 賦值運算符具有右結合性, 而且優先級比算術運算符低
      • 例如: int a = 3 + 5; 會先計算3 + 5, 然後再把結果賦值給a
      • 例如: int a = b = c = 5; 右結合性可理解爲a=(b=(c=5))

複合運算符

本小節知識點:

  1. 【理解】複合賦值運算符

1.複合賦值運算符

  • 在賦值符“=”之前加上其它二目運算符可構成複合賦值符。
    • /= 除後賦值 變量/=表達式 如: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
      構成複合賦值表達式的一般形式爲:
      變量 雙目運算符 = 表達式; 如: a *= 1 + 2;
      它等效於
      變量 = 變量 雙目運算符 表達式; 如: a = (1 + 2) * a;
      
  • 注意:賦值運算符優先級排名14位,僅僅高於“,”運算符。

自增運算符

本小節知識點:

  1. 【瞭解】自增、自減運算符介紹
  2. 【掌握】自增、自減運算符求值過程
  3. 【瞭解】練習

1.自增、自減運算符介紹

  • 在程序設計中,經常遇到“i=i+1”和“i=i-1”這兩種極爲常用的操作。C語言爲這種操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章