導讀:
運算子的種類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 i i i i i i 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 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;
x=a+b,y=b+c;
printf("y=%d,x=%d",y,x);
}
a x 本例中,y等於整個逗號運算式的值,也就是運算式2的值,x是第一個運算式的值。對於逗號運算式還要說明兩點:
1.逗號運算式一般形式中的運算式1和運算式2 也可以又是逗號運算式。例如: 運算式1,(運算式2,運算式3) 形成了嵌套情形。因此可以把逗號運算式擴充為以下形式: 運算式1,運算式2,…運算式n 整個逗號運算式的值等於運算式n的值。
2.程式中使用逗號運算式,通常是要分別求逗號運算式內各運算式的值,並不一定要求整個逗號運算式的值。
3.並不是在所有出現逗號的地方都組成逗號運算式,如在變數說明中,函數參數表中逗號只是用作各變數之間的間隔符。
本文轉自
http://sefeng1982.bokee.com/5366860.html