-
「=」(assignment operator) 的意義:「 設定給 」
- 數學的迷思
a = a + 5;
- 電腦中,變數的觀念
實驗1:5 = a + 5;
實驗2:a + b = a + 5;
- "=" 的左 與 "=" 的右
- [範例]: 直接印值 printf(" Answer: %d\n",
2*3+4/2 );
- [練習]:
a = () , a = ?
請將上述算式,以範例printf的算式來計算,並顯示出正確的數值?
(不能直接兜答案、不能宣告變數.)
- [練習 急轉彎]
如果要將一個班級的同學們平均分成三組,
請問如何以一個運算式的結果,來計算表示呢?
- 算數運算子(Arithmetic Operator)
算子 |
範例 |
說明 |
備註 |
*, / |
a
* b |
a
乘以b |
|
a
/ b |
a
除以b |
|
% |
a%b |
a除以b後,取其餘數 |
讀作(mod) |
+, - |
a+b |
a加b |
|
a-b |
a減b |
|
- 範例1
要如何寫成算式表示?
- 範例2 [上機練習]
請輸出:
d1(b^2-4ac)=
d2(a^3-a^2-1)=
- 練習1: [上機練習] 請將範例2 改為a, b, c手動輸入
a =
b =
c =
d1(b^2-4ac)=
d2(a^3-a^2-1)=
- 練習2: y=aX2+bX+c, (X,a,b,c都為整數)
輸入 X, a, b, c, 輸出y的值
測資1:
輸入: 6 3 2 1
輸出: y=121
測資2:
輸入: 3 7 5 7
輸出: y=85
- 位元運算子(Bitwise Logical Operator)
算子 |
範例 |
說明 |
備註 |
>> |
a
>> b |
將a化成位元組,往右移b個位元 |
|
<< |
a
<< b |
將a化成位元組,往左移b個位元 |
|
| |
a
| b |
a
和 b 做 OR 運算 |
|
& |
a
& b |
a
和 b 做 And 運算 |
|
~ |
~a |
將
a 做 Not 運算 |
|
^ |
a^b |
a
和 b 做 XOR 運算 |
|
ps1: 運算對象為位元, 所以是將 a,
b轉換成二進位後的值再運算。
ps2: XOR([0,0]和[1,1]=0,[1,0]和[0,1]=1)
補充說明:
XOR在密碼學裡,常被用來做資料與金鑰的加密與解密運算:
A xor B = C, C xor A = B, C xor B = A.
#include <stdio.h>
main()
{
char ch='a';
printf("before encoding:%c\n", ch);
ch = ch^0x6;
printf("encoding:%c\n", ch);
ch = ch^0x6;
printf("decoding:%c\n", ch);
}
執行看看結果...
- 比較運算子(Comparison Operator)
算子 |
範例 |
結合 |
備註 |
>,
< |
a>b,
a<b |
比較a大於或小於b |
|
== |
a
== b |
比較a,b是否相等 |
|
!= |
a
!= b |
比較a,b是否不相等 |
|
>=,
<= |
a>=b,a<=b |
比較a大於或等於b,
a小於或等於b |
|
- 邏輯運算子(Logical Operator)
算子 |
範例 |
結合 |
備註 |
&& |
a
&& b |
a
和 b 做 And 運算 |
|
|| |
a
|| b |
a
和 b 做 OR 運算 |
|
! |
!
a |
a
做 Not 運算 |
|
- 遞增、遞減運算子(increment, decrement)
算子 |
範例 |
結合 |
備註 |
++ |
a++;(後置)
++a;(前置) |
以舊有的a 運算後, 才將a 加1.
先將a 增1, 再以其值作其他運算. |
a=a+1; |
-- |
a--;
--a; |
以舊有的a 運算後, 再將a 減1.
先將a 減1, 再以其值作其他運算. |
a=a-1; |
- [範例1]: [結合性] 右到左, 左到右
#include <stdio.h>
main()
{
int a=2, b=3, ans;
ans=(a++)*b;
printf("Answer:%d, a=%d, b=%d\n",ans,a,b);
}
請寫下執行結果.
- [範例2]:
#include <stdio.h>
main()
{
int a=2, b=3, ans;
ans=(++a)*b;
printf("Answer:%d, a=%d, b=%d\n",ans,a,b);
}
請寫下執行結果.
- [實作1]:
#include <stdio.h>
main()
{
int a=2, b=3, ans;
ans=a*b;
a=a+1;
printf("Answer:%d, a=%d, b=%d\n",ans,a,b);
}
請問,實作1執行結果,和哪一個範例結果一樣,比較之!
- 常用運算子執行優先順序表(越上面越優先)
算子 |
說明 |
結合性 |
備註 |
(
) |
括號, 函數 |
|
|
+
- |
正負號 |
右→左 |
|
++,
-- |
遞增,
遞減 |
|
|
! |
邏輯算子(Not) |
|
|
(type) |
強制型別轉換 |
|
|
*
/ |
乘,
除 |
左→右 |
|
% |
取餘數 |
|
|
+
- |
加,
減 |
左→右 |
|
<,
<=, >, >= |
比較算子 |
左→右 |
|
==,
!= |
相等算子 |
左→右 |
|
^ |
位元算子 |
左→右 |
|
&& |
邏輯算子(且And) |
左→右 |
|
|| |
邏輯算子(或OR) |
左→右 |
|
=
+=,
-=,
*=,
/=
%= |
設定運算子 a+=b;就是a=a+b; a-=b;就是a=a-b; *=,
/= 亦同.
|
右→左 |
|
- sizeof() 是一元運算子,而不是函數!
#include <stdio.h>
#include <stdlib.h>
main()
{
int a=2;
printf("%d\n",
sizeof(++a)
);
printf("%d\n", a );
return 0;
}
執行看看,結果為何?
如果是函數,則運算式++a會先計算,然後傳遞值給函數,
但得到的結果,並非是如此,而是直接對變數的一元運算子。
|
|