第三章 基本運算符和表達式

 

運算符的種類、優先級和結合性
C語言中運算符和表達式數量之多, 在高級語言中是少見的。正是豐富的運算符和表達式使C語言功能十分完善。 這也是C語言的主要特點之一。
C語言的運算符不僅具有不同的優先級, 而且還有一個特點,就是它的結合性。在表達式中, 各運算量參與運算的先後順序不僅要遵守運算符優先級別的規定,還要受運算符結合性的制約, 以便確定是自左向右進行運算還是自右向左進行運算。 這種結合性是其它高級語言的運算符所沒有的,因此也增加了C語言的複雜性。

運算符的種類C語言的運算符可分爲以下幾類:
1.算術運算符
用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求餘(或稱模運算,%)、自增(++)、自減(--)共七種。
2.關係運算符
用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。
3.邏輯運算符
用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
4.位操作運算符
參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
5.賦值運算符
用於賦值運算,分爲簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
6.條件運算符
這是一個三目運算符,用於條件求值(?:)。
7.逗號運算符
用於把若干表達式組合成一個表達式(,)。
8.指針運算符
用於取內容(*)和取地址(&)二種運算。
9.求字節數運算符
用於計算數據類型所佔的字節數(sizeof)。
10.特殊運算符
有括號(),下標[],成員(→,.)等幾種。

優先級和結合性
C語言中,運算符的運算優先級共分爲15級。1級最高,15級最低。在表達式中,優先級較高的先於優先級較低的進行運算。 而在一個運算量兩側的運算符優先級相同時, 則按運算符的結合性所規定的結合方向處理。 C語言中各運算符的結合性分爲兩種,即左結合性(自左至右)和右結合性(自右至左)。例如算術運算符的結合性是自左至右,即先左後右。如有表達式x-y+z則y應先與“-”號結合, 執行x-y運算,然後再執行+z的運算。這種自左至右的結合方向就稱爲“左結合性”。而自右至左的結合方向稱爲“右結合性”。 最典型的右結合性運算符是賦值運算符。如x=y=z,由於“=”的右結合性,應先執行y=z再執行x=(y=z)運算。 C語言運算符中有不少爲右結合性,應注意區別,以避免理解錯誤。

算術運算符和算術表達式基本的算術運算符
1.加法運算符“+”加法運算符爲雙目運算符,即應有兩個量參與加法運算。如a+b,4+8等。具有右結合性。
2.減法運算符“-”減法運算符爲雙目運算符。但“-”也可作負值運算符,此時爲單目運算,如-x,-5等具有左結合性。
3.乘法運算符“*”雙目運算,具有左結合性。
4.除法運算符“/”雙目運算具有左結合性。參與運算量均爲整型時, 結果也爲整型,捨去小數。如果運算量中有一個是實型,則結果爲雙精度實型。
void main(){
printf("/n/n%d,%d/n",20/7,-20/7);
printf("%f,%f/n",20.0/7,-20.0/7);
}
雙目運算具有左結合性。參與運算量均爲整型時, 結果也爲整型,捨去小數。如果運算量中有一個是實型,則結果爲雙精度實型。 printf("/n/n%d,%d/n",20/7,-20/7);
printf("%f,%f/n",20.0/7,-20.0/7);
本例中,20/7,-20/7的結果均爲整型,小數全部捨去。而20.0/7和-20.0/7由於有實數參與運算,因此結果也爲實型。
5.求餘運算符(模運算符)“%”雙目運算,具有左結合性。要求參與運算的量均爲整型。 求餘運算的結果等於兩數相除後的餘數。
void main(){
printf("%d/n",100%3);
}
雙目運算,具有左結合性。求餘運算符% 要求參與運算的量均爲整型。本例輸出100除以3所得的餘數1。

自增1,自減1運算符
自增1運算符記爲“++”,其功能是使變量的值自增1。自減1運算符記爲“--”,其功能是使變量值自減1。自增1,自減1運算符均爲單目運算,都具有右結合性。可有以下幾種形式: ++i i自增1後再參與其它運算。--i i自減1後再參與其它運算。
i++  i參與運算後,i的值再自增1。
i--  i參與運算後,i的值再自減1。
在理解和使用上容易出錯的是i++和i--。 特別是當它們出在較複雜的表達式或語句中時,常常難於弄清,因此應仔細分析。
void main(){
int i=8;
printf("%d/n",++i);
printf("%d/n",--i);
printf("%d/n",i++);
printf("%d/n",i--);
printf("%d/n",-i++);
printf("%d/n",-i--);
} i<--8
i<--i+1
i<--i-1
i<--i+1
i<--i-1
i<--i+1
i<--i-1 int i=8;
printf("%d/n",++i);
printf("%d/n",--i);
printf("%d/n",i++);
printf("%d/n",i--);
printf("%d/n",-i++);
printf("%d/n",-i--);
i的初值爲8
第2行i加1後輸出故爲9;
第3行減1後輸出故爲8;
第4行輸出i爲8之後再加1(爲9);
第5行輸出i爲9之後再減1(爲8) ;
第6行輸出-8之後再加1(爲9);
第7行輸出-9之後再減1(爲8)
void main(){
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);
}
i<--5,j<--5,p<--0,q<--0
i+i+i--->p,i+1-->i,i+1-->i,i+1-->i
j+1->j,j+1->j,j+1->j,j+j+j->q int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
這個程序中,對P=(i++)+(i++)+(i++)應理解爲三個i相加,故P值爲15。然後i再自增1三次相當於加3故i的最後值爲8。而對於q 的值則不然,q=(++j)+(++j)+(++j)應理解爲q先自增1,再參與運算,由於q自增1三次後值爲8,三個8相加的和爲24,j的最後值仍爲8。算術表達式表達式是由常量、變量、函數和運算符組合起來的式子。 一個表達式有一個值及其類型, 它們等於計算表達式所得結果的值和類型。表達式求值按運算符的優先級和結合性規定的順序進行。 單個的常量、變量、函數可以看作是表達式的特例。

算術表達式
是由算術運算符和括號連接起來的式子, 以下是算術表達式的例子:
a+b  (a*2)/c (x+r)*8-(a+b)/7  ++i sin(x)+sin(y)  (++i)-(j++)+(k--)

賦值運算符和賦值表達式
簡單賦值運算符和表達式,簡單賦值運算符記爲“=”。由“= ”連接的式子稱爲賦值表達式。其一般形式爲: 變量=表達式 例如:
x=a+b
w=sin(a)+sin(b)
y=i+++--j 賦值表達式的功能是計算表達式的值再賦予左邊的變量。賦值運算符具有右結合性。因此
a=b=c=5
可理解爲
a=(b=(c=5))
在其它高級語言中,賦值構成了一個語句,稱爲賦值語句。 而在C中,把“=”定義爲運算符,從而組成賦值表達式。 凡是表達式可以出現的地方均可出現賦值表達式。例如,式子x=(a=5)+(b=8)是合法的。它的意義是把5賦予a,8賦予b,再把a,b相加,和賦予x ,故x應等於13。
在C語言中也可以組成賦值語句,按照C語言規定, 任何表達式在其未尾加上分號就構成爲語句。因此如x=8;a=b=c=5;都是賦值語句,在前面各例中我們已大量使用過了。
如果賦值運算符兩邊的數據類型不相同, 系統將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。具體規定如下:
1.實型賦予整型,捨去小數部分。前面的例2.9已經說明了這種情況。
2.整型賦予實型,數值不變,但將以浮點形式存放, 即增加小數部分(小數部分的值爲0)。
3.字符型賦予整型,由於字符型爲一個字節, 而整型爲二個字節,故將字符的ASCII碼值放到整型量的低八位中,高八位爲0。
4.整型賦予字符型,只把低八位賦予字符量。
void main(){
int a,b=322;
float x,y=8.88;
char c1='k',c2;
a=y;
x=b;
a=c1;
c2=b;
printf("%d,%f,%d,%c",a,x,a,c2);
}
int a,b=322;
float x,y=8.88;
char c1='k',c2;
printf("%d,%f,%d,%c",a=y,x=b,a=c1,c2=b);
本例表明了上述賦值運算中類型轉換的規則。a爲整型,賦予實型量y值888後只取整數8。x爲實型,賦予整型量b值322, 後增加了小數部分。字符型量c1賦予a變爲整型,整型量b賦予c2 後取其低八位成爲字符型(b的低八位爲01000010,即十進制66,按ASCII碼對應於字符B)。

複合賦值符及表達式
在賦值符“=”之前加上其它二目運算符可構成複合賦值符。如
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。 構成複合賦值表達式的一般形式爲: 變量 雙目運算符=表達式 它等效於 變量=變量 運算符 表達式 例如: a+=5 等價於a=a+5  x*=y+7 等價於x=x*(y+7)  r%=p 等價於r=r%p
複合賦值符這種寫法,對初學者可能不習慣, 但十分有利於編譯處理,能提高編譯效率併產生質量較高的目標代碼。逗號運算符和逗號表達式在

逗號運算符
C語言中逗號“,”也是一種運算符,稱爲逗號運算符。 其功能是把兩個表達式連接起來組成一個表達式, 稱爲逗號表達式。
其一般形式爲: 表達式1,表達式2 其求值過程是分別求兩個表達式的值,並以表達式2的值作爲整個逗號表達式的值。
void main(){
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf("y=%d,x=%d",y,x);
}
a<--2,b<--4,c<--6,x<--0,y<--0
x<--a+b,y<---b+c
本例中,y等於整個逗號表達式的值,也就是表達式2的值,x是第一個表達式的值。對於逗號表達式還要說明兩點:
1.逗號表達式一般形式中的表達式1和表達式2 也可以又是逗號表達式。例如: 表達式1,(表達式2,表達式3) 形成了嵌套情形。因此可以把逗號表達式擴展爲以下形式: 表達式1,表達式2,…表達式n 整個逗號表達式的值等於表達式n的值。
2.程序中使用逗號表達式,通常是要分別求逗號表達式內各表達式的值,並不一定要求整個逗號表達式的值。
3.並不是在所有出現逗號的地方都組成逗號表達式,如在變量說明中,函數參數表中逗號只是用作各變量之間的間隔符。
[Practice] //arithmeticint a,b,c;
float d;
a=11;
b=235;
c=a+b-a*b;
d=(float)c/(float)a;
a=c/a;'Vtable
a,2,0
b,2,0
c,2,0
d,4,0.0
of Vtable
'Vupdate
1,0;2,0;3,0
4,0.0
1,11
2,235
3,-2339
4,-212.636368
1,-212
of Vupdate
of Practice
[Practice] //1int a,b,c1,c2;
a=25;
b=3243;
c1=b/a;
c2=b%a;'Vtable
a,2,0
b,2,0
c1,2,0
c2,2,0
of Vtable
'Vupdate
1,0;2,0;3,0;4,0
1,25
2,3243
3,129
4,18
of Vupdate
of Practice
[Practice] //1int a,b,c;
a=25;
b=40;
c=a+b,c+35;'Vtable
a,2,0
b,2,0
c,2,0
of Vtable
'Vupdate
1,0;2,0;3,0
1,25
2,40
3,65
of Vupdate
of Practice

小結

1.C的數據類型
基本類型,構造類型,指針類型,空類型
2.基本類型的分類及特點
類型說明符      字節       數值範圍
字符型char        1        C字符集
基本整型int       2        -32768~32767
短整型short int     2         -32768~32767
長整型 long int     4      -214783648~214783647
無符號型 unsigned    2        0~65535
無符號長整型 unsigned long 4      0~4294967295
單精度實型 float    4       3/4E-38~3/4E+38
雙精度實型 double   8       1/7E-308~1/7E+308
3.常量後綴
L或l 長整型
U或u 無符號數
F或f 浮點數
4.常量類型
整數,長整數,無符號數,浮點數,字符,字符串,符號常數,轉義字符。
5.數據類型轉換
·自動轉換
在不同類型數據的混合運算中,由系統自動實現轉換, 由少字節類型向多字節類型轉換。 不同類型的量相互賦值時也由系統自動進行轉換,把賦值號右邊的類型轉換爲左邊的類型。
·強制轉換
由強制轉換運算符完成轉換。
6.運算符優先級和結合性
一般而言,單目運算符優先級較高,賦值運算符優先級低。 算術運算符優先級較高,關係和邏輯運算符優先級較低。 多數運算符具有左結合性,單目運算符、三目運算符、 賦值
7.表達式
表達式是由運算符連接常量、變量、函數所組成的式子。 每個表達式都有一個值和類型。 表達式求值按運算符的優先級和結合性所規定的順序進行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章