運算式

文章推薦指數: 80 %
投票人數:10人

運算符號 · ※與國小數學中所學到的規則相同,先乘除後加減,有括號則先做。

· 運算符號的優先順序與結合律. 〔回高一首頁〕〔回上一頁〕 程式與數學的分別  main(){         int a,b;         a=23;         b=a+2; //請問這時候b=??         b=b+2; //請問這時候b=??} 以上例子提到表示式b=a+2與數學表示式很似,不過,程式與數學不是完全相同的。

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

運算符號 意義 = 右值指定給左值 程式與數學的相同 運算符號         許多特殊字元具有特別的意義,下列是幾個算術運算符號:   +:加法  -:減法  *:乘法  / :除法    %:餘數,只適用於整數型態    ※與國小數學中所學到的規則相同,先乘除後加減,有括號則先做。

運算符號的優先順序與結合律          運算式的計算要依據運算符號的優先順序(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 main(){  inti=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 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)  字元型賦予整型,由於字元型為一個位元組,而整型為二個位元組,故將字元的ASCIIcode。

【例】 #include  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為整型,賦予實型量y值8.88後只取整數8。

x為實型,賦予整型量b值322,後增加了小數部分。

字元型量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;  ints,r=5;  s=r*r*PI;   printf("s=%d\n",s); } 本例程式中,PI為實數;s,r為整數。

在執行s=r*r*PI語句時,r和PI都轉換成double型計算,結果也為double型。

但由於s為整型,故賦值結果仍為整型,舍去了小數部分。

其一般形式為:    (類型說明符) (運算式) 其功能是把運算式的運算結果強制轉換成類型說明符所表示的類型。

例如:    (float)a     a           (int)(x+y)    x+y    



請為這篇文章評分?