C語言中運算子和表示式數量之多

2021-06-19 11:54:54 字數 4758 閱讀 9720

第三章 基本運算子和表示式

運算子的種類、優先順序和結合性

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() 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;

C語言中運算子和表示式

十分完善。這也是c語言的主要特點之一。c語言的運算子不僅具有 不同的優先順序,而且還有乙個 特點,就是它的結合性。在表示式中,各運算量參與 運算的先後順序不僅要遵守運算子優先順序別的規定,還要受運算子結合性的制約,以便確定是自左向右進行運算還是自右向左進行運算。這種結合性是其它高階語言的運算子所沒有...

C語言中型別 運算子 表示式

1.名字是由字母和數字組成,第乙個字元必須是字母,下劃線 被認為是字母 2.大小寫字母有區別,變數名用小寫,符合常量全部使用大寫字母 3.變數名不要以 開頭,為了提高可讀性,以 字母 字母 為好 1.char字元型 占用乙個位元組 2.int整型 反映機器中整數型別的自然長度 3.float型別 單...

c語言中逗號運算子和逗號表示式

c語言提供一種特殊的運算子 逗號運算子。用它將兩個表示式連線起來。如 3 5,6 8 稱為逗號表示式,又稱為 順序求值運算子 逗號表示式的一般形式為 表示式1,表示式2 逗號表示式的求解過程是 先求解表示式1,再求解表示式2。整個逗號表示式的值是表示式2的值。例如,上面的逗號表示式 3 5,6 8 ...