回高一首頁〕〔回上一頁

red05_next.gif程式與數學的分別

 main()
{
         int a,b;
         a=23;
         b=a+2; //請問這時候b=??
         b=b+2; //請問這時候b=??
}

以上例子提到表示式b=a+2與數學表示式很似,不過,程式與數學不是完全相同的。就以等於符號「=」為例,以下是一個表示式: 

左邊表示式 = 右邊表示式

在數學上,這是「等式」(Equation),意思是「左邊表示式的值與右邊表示式的值是相等的」,但在程式上就不是這個意思了,而是「把右邊表示式的值儲存在左邊表示式所代表的記憶體地址」。

=

右值指定給左值

red05_next.gif程式與數學的相同

運算符號

        許多特殊字元具有特別的意義,下列是幾個算術運算符號:

  +:加法
  - :減法
  *:乘法
  / :除法
    %:餘數,只適用於整數型態
    ※與國小數學中所學到的規則相同,先乘除後加減,有括號則先做。

運算符號的優先順序與結合律

         運算式的計算要依據運算符號的優先順序(precedure)與結合律(associativity)的規則,但是在括弧內的運算式則必須先計算。括弧使運算看來更明白,也能改變運算的先後次序,以下列的運算式為例:1 + 2 * 3  由於 "*"的優先順序高於 "+",亦即要先作乘法再作加法,因此計算後所得結 果為 7 。這式子也可寫成這樣:1 + ( 2 * 3 )  另一方面,由於括弧中的運算式要先計算,因此下列所示( 1 + 2 ) * 3  的運算結果就不一樣了;其答案為 9 。再看下面這個運算式1 + 2 - 3 + 4 - 5  因為 "+"和 "-"具有相同的優先順序,根據結合律,這式子要由左而右計算, 這就相當於( ( ( 1 + 2 ) - 3 ) + 4 ) - 5

     下面的表格是一些運算符號的優先順序與結合律。

運 算 符 號

結  合  律(運算順序)

  - (單元的正負號)   ++   --  

 由 右 至 左

*    /     %

由 左 至 右

 +      -

由 左 至 右

=  +=  -=  *=  /=

由 右 至 左

  •   複合的賦值運算符

在賦值符“=”之前加上其他二目運算符可構成複合賦值符。如+=,-=,*=,=,%=,<<=,>>=,&=,^=,|=構成複合賦值運算式的一般形式為:

變數  雙目運算符=運算式

變數=變數 運算符 運算式

    a+=5         等價於a=a+5

    x*+=y+7    等價於x*=x*(y+7)

    r%=p       等價於r=r%p

複合賦值符這種寫法,對初學者可能不習慣,但十分有利於編譯處理,能提高編譯效率並產生品質較高的目標代碼。


  • i= i+1;    =>      i+=1;             =>  i++;

    1++11--111        ++i ;  // i自增1後再參與其他運算。

            --i;    //i自減1後再參與其他運算。

            i++ ;  //  i參與運算後,i的值再自增1

            i-- ;   //i參與運算後,i的值再自減1

    在理解和使用上容易出錯的是 i++i-- 特別是當它們出在較複雜的運算式或語句中時,常常難於弄清,因此應仔細分析。

    【例】

#include<stdio.h>

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

 }

 

執行結果:

9

8

8

9

-8

-9

請按任意鍵繼續 . . .

  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)。

【例

#include<stdio.h>

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

     

 }

 

執行結果:

15,24,8,8

 

 

這個程式中,對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。

 

類型轉換

如果賦值運算符兩邊的資料類型不相同,系統將自動進行類型轉換,即把賦值號右邊的類型換成左邊的類型。具體規定如下:

1)   實型賦予整型,舍去小數部分。前面的例子已經說明了這種情況。

2)  整型賦予實型,數值不變,但將以浮點形式存放,即增加小數部分(小數部分的值為0)

3)  字元型賦予整型,由於字元型為一個位元組,而整型為二個位元組,故將字元的ASCII code。

【例】

#include<stdio.h>

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

 }

本例表明了上述賦值運算中類型轉換的規則。a為整型,賦予實型量y8.88後只取整數8x為實型,賦予整型量b322 後增加了小數部分。字元型量c1賦予a變為整型,整型量b賦予c2 後取其低八位元成為字元型(b的低八位為01000010,即十進位66,按ASCII碼對應於字元B)

 

自動轉換遵循以下規則:

1)  若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。

2)  轉換按資料長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。

3)  所有的浮點運算都是以雙精度進行的,即使僅含float單精確度量運算的運算式,也要先轉換成double4)   char型和short型參與運算時,必須先轉換成int5)  在賦值運算中,賦值號兩邊量的資料類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的資料類型長度左邊長時,將丟失一部分資料,這樣會降低精度,丟失的部分按四捨五入向前舍入。

main(){

      float PI=3.14159;

      int s,r=5;

      s=r*r*PI;

      printf("s=%d\n",s);

}

本例程式中,PI為實數;sr為整數。在執行s=r*r*PI語句時,rPI都轉換成double型計算,結果也為double型。但由於s為整型,故賦值結果仍為整型,舍去了小數部分。

  • 其一般形式為:

        (類型說明符)  (運算式)

    其功能是把運算式的運算結果強制轉換成類型說明符所表示的類型。

    例如:

        (float) a      a           (int)(x+y)     x+y