等運算子

Download Report

Transcript 等運算子

Introduction to C Language
─ 運算子與表示式
大綱








運算子、運算元和表示式
數學運算表示式
指定表示式
邏輯關係表示式
位元運算表示式
資料型態的轉換
運算子優先順序
Homework
1
運算子、運算元和表示式

所有C語言程式皆由表示式(expression)所
組成,其主要的使用方法就是做運算,
而運算時就得用運算子將這些常數或變
數組合起來變成一個表示式。或許也可
以稱為運算式。



運算子是指運算的符號,如:+、-、*、/…
等
利用運算子可以將變數、常數及函式連接起
來形成一個表示式,並運算出結果
這些被拿來運算的變數、常數和函式,稱為
運算元(operand)
2
運算子、運算元和表示式 (續)

Ex. 何謂運算子、運算元與表示式?
int length=10, width=20; //宣告也算是一種表示式
double area;
area=(length+5)*(width+10)/3 //運算式也是表示式
此表示內包含了=、+、*、/等運算子,
而area、length、5、width、10、3等都是運算元,
這些運算子都需要兩個運算元才能合法運算;
也就是說,運算子的兩旁,必須都有一個運算元,
才能算是完整的運算式。
3
運算子、運算元和表示式 (續)

運算子


一個運算子可以處理一個、兩個或三個運算
元,將視何種運算子而定
一元運算子 (處理一個運算元)


二元運算子 (處理兩個運算元)


Ex. a++、b--…
Ex. a+b、a-b、a*c…
三元運算子 (處理三個運算元)

Ex. X>y?x:y
4
運算子、運算元和表示式 (續)

Ex. 試解釋 d=a+b*c 之表示式
a和b*c是“+”運算子的運算元
d = a + b *c ;
b和c是“*”運算子的運算元
d和a+b*c是“=”運算子的運算元
5
運算子、運算元和表示式 (續)
一元運算子
++ 遞增
* 指標間接運算子
! 邏輯-not
-- 遞減
& 求址
~ 求1的補數
sizeof 佔用記憶體大小
- 負數
+ 正數
二元運算子
+ 加
- 減
* 乘
/ 除
% 餘數(模數)
<< 左偏移
>> 右偏移
> 大於
< 小於
>= 大於等於
<= 小於等於
= = 邏輯等於
!= 不等於
& 位元運算-and
| 位元運算-or
^ 位元運算-xor
&& 邏輯-and
|| 邏輯-or
= 等於
+= 遞增等於
-= 遞減等於
*= 遞乘等於
/= 遞除等於
%= 遞除除數等於
<<= 左偏移等於
>>= 右偏移等於
&= 位元運算 and 等於
|= 位元運算 or 等於 ^= 位元運算 xor 等於
三元運算子
? : 條件運算
6
運算子、運算元和表示式 (續)

表示式

基本表示式(primary express)



字尾表示式(postfix express)



這是任何複雜表示式的基本組成分子,包括常數表示
式、變數名稱、函式名稱等皆可視為基本的表示式
Ex. 18, age, “Jack”
在基本表示式後加上一個運算元者,稱為字元表示式
Ex. name[0], age++…
一元運算式(unary expression)


由一元運算子構成的表示式
Ex. age++, -123, sizeof(int)…
7
運算子、運算元和表示式 (續)

二元運算式(binary expression)



三元運算式(ternary expression)



由二元運算子構成的表示式
Ex. x+y, x>10, a=b…
由三元運算子構成的表示式條件運算子運算式
Ex. x>y?x:y
常數表示式(constant expression)


表示式由常數組成
Ex. 12*24, 10*10*3.14…
8
運算子、運算元和表示式 (續)

型態轉換表示式(expressions with explicit type
conversions)



當資料須要強制轉換成另一種型態時,可於表示
前加上欲轉換的型態
Ex. (double) (10*10*3.14)
成員指示運算子表示式(expressions with
pointer-to-member operators)


在結構型態中,需要指向結構中的成員時,會用
成員指示運算子「.」或「->」來表示
Ex. School.name, stock->id…
9
數學運算表示式

四則運算 +-*/


須搭配兩個運算元才能合法運算
餘數運算 %

所謂餘數就是經過除法運算後所得的餘數
10
數學運算表示式 (續)

Ex. 由使用者輸入一個數,計算此數的平方及
立方,並顯示在螢幕上
#include<stdio.h>
#include<stdlib.h>
void main()
{
int n;
printf("please input a number:");
scanf("%d", &n);
printf("The square of number is %d.\n", n*n);
printf("The triple of number is %d.\n", n*n*n);
system("PAUSE");
}
11
12
數學運算表示式 (續)

Ex. 讓使用者輸入一個小於15的整數,程式將它轉
換成二進位數
#include<stdio.h>
#include<stdlib.h>
void main()
{ int n;
short int d1, d2, d3, d4;
printf("Please input an integer number(at most 15):");
scanf("%d", &n);
d1=n%2;
n=n/2; d2=n%2;
n=n/2; d3=n%2;
n=n/2; d4=n%2;
printf("The binary code of the integer number is %d%d%d%d\n",d4,d3,d2,d1);
system("PAUSE");}
13
14
數學運算表示式 (續)

遞增運算 ++


為一元運算子
其作用可將運算元增加1


遞增運算子有兩種格式,且有不同的計算順序



Ex. 假如變數a之值為3,經過a++運算後,a值變成4,
相當於做了a=a+1的運算
運算子++放在運算元前面
運算子++放在運算元後面
遞減運算 -
恰與遞增運算元相反,可將運算元減少1
15
數學運算表示式 (續)

Ex. 試比較遞增運算子放在運算元之前與之後
的差異
#include<stdio.h>
#include<stdlib.h>
void main()
{
int i1=3, i2=3, s1, s2;
s1=i1++;
printf("i1=%d, s1=%d\n", i1, s1);
s2=++i2;
printf("i2=%d, s2=%d\n", i2, s2);
system("PAUSE");
}
16
17
指定表示式


指定(assignment)表示式就是包含等號“=”的運
算子所構成的表示式,其作用是將等號右邊的運
算結果,指定到左邊的變數
等號運算 =


將等號右邊的運算結果,指定到左邊的變數
int a=12, b=20;
int c=a+b;
a=c*10+b;
不合法的敍述
a+b=c; //等號左邊不能有運算式
a=b+c=d; //第二個等號的左邊不能有運算式b+c
3=a+b; //等號左邊必須為變數,不能為常數
18
指定表示式 (續)

運算等號 +=, -=, *=, /=, %=…

此一指定符號的通用寫法是a op =b,其中a為變數和b為
表示式,op是運算子,包括+,-,*,/,%,<<,>>,&,^,|等將b
表示式計算結果和a做op運算,再將運算的結果指定給a
int a=10, b=3, x=2, y=5;
a+=8; //相當於a=a+8,將a值加8後存回變數a
//因為a=10,則a+=8運算後,a值變成18
a+=b; //相當於a=a+b,a值變為18+3=21
x*=(y+3); //相當於x=x*(y+3),x值變為2*(5+3)=16
y%=b; //相當於y=y%b,y值變為5%3=2
19
指定表示式 (續)

Ex. 試計算出a, b, c, d, e, f各為多少?
#include<stdio.h>
void main()
{int a,b,c,d,e,f;
a=b=c=d=e=f=3;
a+=++b-c;
d-=e*f--;
f%=--a/c++;
c*=a--+f++*b++;
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
printf("e=%d\n",e);
printf("f=%d\n",f); }
20
21
邏輯關係表示式

邏輯關係表示式



由二元關係運算子(binary relational operators)
和其兩個運算元所組成
常用於條件判斷命令(如if…else…命令),此
運算子將比較其兩個運算元是否符合所指定
的關係
運算結果只有兩種,即0或非0。在關係運算
規則中以0代表false(偽)以1或非0的數代表
truth(真)
22
邏輯關係表示式 (續)

比較大小關係運算子 >,<,>=,<=



其作用在於比較運算子左右兩邊的值是否符合運算子定
義的關係
符合即輸出為「真」,否則則為「偽」
Ex.
int a=5, b=3, c=9;
printf(“%d\n”, a<b); //因為a比b大,故a<b為false,輸出0
printf(“%d\n”, c<=9) ; //因為c=9,故c<=9為truth,輸出1
printf(“%d\n”, a>b<c); //因為a>b且b<c,故a>b<c為truth,輸出1
23
邏輯關係表示式 (續)

等號關係運算子 ==, !=

==代表等於,!=代表不等於


= =和=不能混用。= =是用在關係運算式裡,=則是
用在指定運算元的值
Ex.
int a=5, b=3, c=9;
printf(“%d\n”, a=b); //輸出結果3
printf(“%d\n”, b!=c) ; //輸出結果1
printf(“%d\n”, c= =a); //輸出結果0
24
邏輯關係表示式 (續)

邏輯運算 &&, ||和!



AND
0
1
這三個符號用在兩個表示式之間的關係運算,
&&代表做AND運算,||代表做OR運算,!代
表做NOT運算
Ex. a>b && a<c
真值表(truth table)
0
0
0
1
0
1
OR
0
1
0
0
1
1
1
1
NOT
0
1
1
0
25
邏輯關係表示式 (續)

Ex.
int a=9, b=12, c=3;
printf(“%d\n”, a>b && a<c); //輸出結果0(false)
printf(“%d\n”, a<c || b>c) ; //輸出結果1(truth)
printf(“%d\n”, !(a>b)); //輸出結果1(truth)
printf(“%d\n”, !(a>b) && b<c || c>0); //輸出結果1(truth)
運算的優先順序是NOT>AND>OR
26
位元運算表示式

位元運算表示式


針對記憶體中的值,進行位元與位元之間的邏輯
運算,記憶體的內容是指運算元在記憶體中的二
元進位形式
AND運算 &
Ex.
int n=10;
printf(“%d”, n&12);
n=10
1
0
1
0

每個位元互相做
AND運算
12
1
1
0
0
n&12
1
0
0
0
=8
27


&和=的組合可形成指定運算子&=,其作用和&相同,只是
多了一個指定的動作,將&運算後的結果存回原來的變數
Ex. 以下列程式簡介上述概念
#include<stdio.h>
#include<stdlib.h>
void main()
{int a=12, b=20, n=10;
printf("a&b=%d\n",a&b); printf("a&8=%d\n",a&8);
printf("36&a=%d\n",36&a); printf("17&29=%d\n",17&29);
/*------------------------------*/
/*
show &=
*/
/*------------------------------*/
printf("-----------------\n");
printf("n&12=%d\n",n&12);
printf("n=%d\n",n);
n&=12;
printf("n=%d\n",n);
printf("-----------------\n");
system("PAUSE"); }
29

OR運算 |


Ex.
int n=10;
printf(“%d”, n|12);
XOR運算 ^

Ex.
int n=10;
printf(“%d”, n^12);
n=10
1
0
1
0
每個位元互相做
OR運算
12
1
1
0
0
n|12
1
1
1
0
n=10
1
0
1
0
=14
每個位元互相做
XOR運算
12
1
1
0
0
n^12
0
1
1
0
=6
位元運算表示式 (續)

左位移運算 <<



左位移運算形式為:a<<b;
即將a的內容向左位移(left-shift)b個位元
<<和=的組合也可形成指定運算子,其作用
和<<相同,只是多了一個指定的動作
n=10
0
0
0
1
0
1
0
每個位元互都向
左移動三個位元
10<<3
1
0
1
0
0
0
0
=80
31
位元運算表示式 (續)

右位移運算 >>



n=10
左位移運算形式為:a>>b;
即將a的內容向右位移(right-shift)b個位元
>>和=的組合也可形成指定運算子,其作用
和>>相同,只是多了一個指定的動作
0
0
0
1
0
1
0
每個位元互都向
右移動三個位元
10>>3
0
0
0
0
0
0
1
=1
32
位元運算表示式 (續)

補數運算 ~


此處的補數(complement)運算指的是二進位
的補數運算,也就是對某數的二進位表示法
進行補數運算
寫法為:~n;
33
資料型態的轉換

在一個運算式當中,變數和變數必須相同
型態才能做運算,因此,不同型態的變數
要做運算時,C語言會先將較低型態(位元
數較少的型態)轉換為較高型態,再做運算

Ex.
int a=12;
long b=120000;
long c=a*b; //a會先轉換成long,再和b相乘

資料型態的高低順序為

long double、double、float、unsigned long、long、
unsigned int、int
34
資料型態的轉換 (續)

強制轉換運算

強制轉型運算子(type-cast operator)的格式為



(欲轉換的型態) 被轉換的表示式
欲轉換的型態 (被轉換的表示式)
Ex.
float fv=5.8f //在小數後加上f表示該常數為浮點數
int iv;
iv=(int)fv; //若未加入強制轉型運算子(int),則在程式編輯時,
//會出現“possible loss of data”的警告
//也可寫成iv = int (fv);
printf(“iv=%d”, iv); //執行結果為5  有資料遺失的情況
35
運算子優先順序
運算子
++
-++
-+
!
~
*
/
%
+
<<
>>
<
>
<=
意義
後置遞增(如++a)
後置遞減(如--a)
前置遞增(如a++)
前置遞減(如a--)
正號(如+a)
負號(如-a)
邏輯運算子:NOT
位元運算子:取1的補數
乘號
除號
取餘數
加號
減號
位元運算子:向左位移
位元運算子:向右位移
小於
大於
小於等於
運算順序
無
無
無
無
無
無
無
無
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
>=
==
!=
&
^
|
&&
||
=
*=
/=
%=
+=
-=
<<=
>>=
&=
|=
^=
大於等於
判斷式等於
不等式
位元運算子:AND
位元運算子:XOR
位元運算子:OR
邏輯運算子:AND
邏輯運算子:OR
等於
乘號指定
除號指定
取餘數指定
加號指定
減號指定
向左位移指定
向右位移指定
位元AND指定
位元OR指定
位元XOR指定
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由左至右
由右至左
由右至左
由右至左
由右至左
由右至左
由右至左
由右至左
由右至左
由右至左
由右至左
由右至左
36
Homework


設計一個程式,輸入一個三位以上的整
數,可以將其百位數數字輸出。例如:
輸入1234,則輸出2(提示:先將輸入的
數除以100,再除以10取其餘數)
設計輸入小寫字母,轉換成大寫字母輸
出。例如:輸入a,則輸出A(提示:大寫
字母A的ASCII碼為65,小寫字母a的
ASCII碼為97)
37