<source : unsplash>

一、心得分享

自己學程式,總是看了很多,可是實作時,又可能遇到 "書到用時方恨少"的窘況。很明顯的,能是學習方式不恰當,無法將這些知識內化成自己的職能。

於是,向許多程式高手和學習專家請益後,唯有將這些知識反覆的在腦袋中重現,搭配運動,才是現階段最有效的吸收方式。因此,關於C程式語言的資料處理部分中,馬上就落實這套方法,透過 "學習 - 實作 - 回想"的循環方式,逐漸讓這些知識變成一種 "反射動作" 。

二、題目自測與筆記

1.已知 a=b=5,x=10、y=20、z=30,請計算 x*=a+=y%=b-=z/=3,最後 x 的值。


如圖,執行的結果,x最後的值為 50

依照運算子的優先順序,步驟拆解如下 :

Step1. 處理 z/=3

z/=3 相當於 z = z / 3,把z=30代入運算後,z值為  10 。

Step2. 處理 b -= z

承接上個步驟 z 值為 10。而  b -= z 相當於 b = b-z,把z=10,b=5代入,b = 5-10。運算後 b 值為 -5。

Step3. 處理 y%=b

承接上個步驟 b 值為 -5。而 y%=b 相當於 y = y % b,把b=(-5),y=20代入,y = 20 % (-5)。運算後 y 值為 0。

Step4. 處理 a+=y

承接上個步驟 y 值為 0。而 a+=y 相當於 a = a + y,把y=0,a=5代入,a = 5 + 0。運算後 a 值為 5。

Step5. 處理  x*=a

承接上個步驟 a 值為 5。而  x*=a 相當於 x = x * 5,把a=5,x=10代入,x = 10 * 5。運算後 x 值為 50

2.請問在 C 中 13|57 與 13^57 的值分別為多少 ?



" | " 是位元運算的 "OR"
" ^ "是位元運算的 "XOR"

所以我們將13和57轉換成二進位。
13 轉換成二進位表示為 1101。
57 轉換成二進位表示為 111001。

進行OR運算和XOR運算,如下圖。


將OR運算的值轉換成10進位,值為 61
將XOR運算的值轉換成10進位,值為 52

3.已知a=10、b=30,經過 a+=a+=b+=b%=4,最後 a 的值為 ?


如圖,執行的結果,a 最後的值為 28

依照運算子的優先順序,步驟拆解如下 :

Step1. 計算 b%=4

b%=4 相當於 b=b%4,把b=30代入運算後,b=30 % 4。結果,b值為  2 。

Step2. 計算 b+=b

承接上個步驟 b 值為 2。而  b+=b 相當於 b = b+b,把b=2代入,b = 2+2。運算後 b 值為 4。

Step3. 計算 a+=b

承接上個步驟 b 值為 4。而  a+=b 相當於 a = a+b,把a=10、b=4代入,a = 10+4。運算後 a 值為 14。

Step4. 計算a+=a

承接上個步驟 a 值為 14。而  a+=a 相當於 a = a+a,把a=14。運算後 a 值為 28


4. a=20、b=30,請計算下列各式結果 ?


結果如圖所示。

解題的重點在於辨別出運算子的優先順序,為方便理解與手算,我們可以用小括號把要優先計算的部分區隔出來,很容易就可以解開各個題目。解題方式條列如下 :

(1)a-b%6+12*b/2
改寫成 a - (b%6)+(12*b/2),經計算後,值為 200。

(2)(a*5)%8/5-2*b
改寫成 ((a*5) % 8 / 5 )- (2*b)。所有的資料型態均為int資料型態,因此小數點後面的數字會被刪去。經計算後,值為 -60。

(3)(a%8)/12*6+12-b/2
改寫成 (a%8)/12*6+12-(b/2)。所有的資料型態均為int資料型態,因此小數點後面的數字會被刪去。經計算後,值為 -3。


5. a=15,則 " a&10 "的結果值為何 ?


結果如圖所示,值為10

思維邏輯同問題2,將15和10轉成二進位。

15 >> 1111
10 >>1010
進行AND運算後為 1010,轉換成十進位後,值為10。


6.求下列位元運算子的相關運算子。

(A) 105 & 26
(B) 10<<3
(C) 105^26
(D) ~10


答案如圖所示。

思維邏輯同題目二,只要進行位元運算,第一步就是將十進位數字轉換成二進位。再根據題目所指定的位元運算子進行運算,即可得到和圖相符的值。

  • 105的二進位為 0110 1001
  • 26的二進位為   0001 1010
  • 10的二進位為   0000 1010

(A) 105 & 26 ........(AND)
1101001 & 11010,值為1000,轉換成十進位為8

(B) 10<<3
1010 往左移3位,值為1010000,轉換成十進位為80

(C) 105^26........(XOR)
1101001 ^ 11010,值為1110011,轉換成十進位為115

(D) ~10 ...........(NOT)
 ~10,即 10的反相值。求值 3 步驟如下 :
  • 轉換成二進位 : 將10轉換成二進位,值為 0000 1010。
  • 求正負號 : 再將0000 1010反相,值為 1111 0101。MSB(最高位元)為1,因此值為1。
  • 求反相值 : 將1111 0101求2's補數,值為 0000 1011,轉換成十進位,值為 -11

7.以下程式碼的列印結果為何 ?


如圖,值為11。

b = a+++a--,可視為 b = (a++) + (a--)。
先看 a++,a++為 a=a+1,將a=5代入,得到最後的a值為6。
再看a--,a--為a=a-1,此時a已經為6,代入後a=6-1,a=5。
將2個a值代入,b=6+5,最後b = 11

0 留言