C語言自學攻略-運算子

C語言自學攻略-運算子

更新於 發佈於 閱讀時間約 5 分鐘

記憶體中的變數

當我們宣告了一個int整數的變數x並賦值為38,那它在記體中的樣子如下圖所示:

raw-image
  • 上圖是假設整數變數x是儲存於記憶體位址中的0x7ffda99fcbdc-0x7ffda99fcbdf
  • 總共32位元bits(4Bytes),符合我們的認知。
  • 10進位的數值會被轉換為電腦看得懂的2進位表示法。

現在我們知道變數在記體中的樣子了,我們接下來想要對變數做一些運算。

運算子

指定運算子

作用:用於將值指定給變數。

  • 常見運算子=, +=, =, =, /=, %=
  • 範例
int a = 10;   // 將 10 指定給 a
a += 5; // 相當於 a = a + 5 (結果: 15)

算數運算子

  • 作用:進行基本的數學運算。
  • 常見運算子+, -, *, /, %
  • 範例
int a = 10, b = 3;
int sum = a + b; // 加法 (結果: 13)
int mod = a % b; // 取餘數 (結果: 1)

遞增(減)運算子

  • 作用:使變數自增或自減 1。
  • 運算子++(遞增),--(遞減)
  • 範例
c
int n=0, a = 5;
n = (a++) + 10; // 後置遞增,會先計算a + 10, 再計算a = a + 1(結果: n=15, a=6)
n = (++a) + 10; // 前置遞增,會先計算a = a + 1, 再計算a + 10(結果: a=7, n=17)

關係運算子

  • 作用:比較兩個值,結果為布林值(truefalse)。
  • 常見運算子==, !=, <, >, <=, >=
  • 範例
int a = 5, b = 10;
if (a < b) { // 比較 (結果: true)
printf("a 小於 b\n");
}

邏輯運算子

  • 作用:進行邏輯運算,返回布林值。
  • 常見運算子&&(AND), ||(OR), !(NOT)
  • 範例
int a = 5, b = 10;
if (a > 0 && b > 0) { // AND 運算 (結果: true && true = true)
printf("a 和 b 都是正數\n");
}

位元運算子

  • 作用:對數值的二進制位元逐一進行位元運算。
  • 常見運算子&(AND), |(OR), ^(XOR), ~(NOT), <<(左移), >>(右移)
  • 範例
int a = 8, b = 2, c=0;
//把a的位元右移b個位元,並將移出的位元捨棄,空缺則補0,相當於a / 2的b次方, 結果為00000000 00000000 00000000 00000010,c=2
c = a>>b;
//把a的位元左移b個位元,並將移出的位元捨棄,空缺則補0,相當於a * 2的b次方, 結果為00000000 00000000 00000000 00100000,c=32
c = a<<b;
c = ~a; //把a的每一位元NOT,即將0變為1,1變為0,結果為11111111 11111111 11111111 11110111,最高位為負號,表示負數,我們對結果取2的補數就可以得到這個負數的數值,我們得到-(00000000 00000000 00000000 00001000+1),c=-9
c = a&b; //結果為: 00000000 00000000 00000000 00000000,c = 0
c = a|b; //結果為:00000000 00000000 00000000 00001010,c = 10
c = a^b; //結果為:00000000 00000000 00000000 00001010,c = 10

練習題

char x = 3;
x = ~x;
(a)//x取反向: 11111100
(b)//取2的補數: 得到-(00000100)
(c)//x = -4

char x = -3;
x = x >> 1;
(a)//-3以2的補數表示為11111101(00000011反相+1)
(b)//右移後得到11111110(注意,因為最高位為負號,這邊我們不補0,要補1)
(c)//取2的補數,得到-(00000010)
(d)//x = -2

條件運算子

  • 作用:根據條件選擇一個值(三元運算子)。
  • 格式條件 ? 真值 : 假值
  • 範例
int a = 5, b = 10;
int max = (a > b) ? a : b; // 若條件為真返回 a,否則返回 b (結果: max=10)

運算子的優先順序

在程式碼中,優先級較高,意味著它們會先被執行

raw-image
raw-image

一樣不用死記硬背,但有時候優先級的高低可能會影響輸出結果,所以大概了解一些優先級大概在哪還是有其必要性,不過忘記回來查就好了。

avatar-img
電資鼠 - 您的學習好夥伴
8會員
200內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。