回覆列表
  • 1 # 就行就直接

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

    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)運算。 中有不少為右結合性,應注意區別,以避免理解錯誤。

    和算術表示式基本的算術運算子

    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.並不是在所有出現逗號的地方都組成逗號表示式,如在變數說明中,函式引數表中逗號只是用作各變數之間的間隔符。

  • 中秋節和大豐收的關聯?
  • 有什麼好看的恐怖小說?