算術運算符和算術表達式(初學者)


1、C語言的運算符可以分為以下幾類:
1.算術運算符:加(+)、減(-)、乘(*)、除(/)、求余(%)、自增(++),自減(--)
2.關系運算符:大於(>)、小於(<)、等於(==)、大於等於(>=)、小於等於(<=)、不等於(!=)
3.邏輯運算符:與(&&)、或(||),非(!)
4.位操作運算符:參與運算的量,按二進制位進行運算。位與(&)、位或(|)、位非(!)、位異或(^)、左移(<<)、右移(>>)
5.賦值運算符:用於賦值運算,分為簡單賦值(=)、復合算術賦值(+=、-=,*=、/=、%=)、和復合位運算賦值(&=、!=、^=、>>=、<<=);
6.條件運算符:這是一個三目運算符,用於條件求值(?、 :)
7.逗號運算符:用於把若干表達式組合成一個表達式(,)
8.指針運算符:用於取內容(*)和區地址(&)
9.求字節數運算符:用於計算數據類型所占的字節數(sizeof)
10.特殊運算符:有括號( )、下標[ ]、成員(->,)
注:參與運算量均為整型時,結果也為整形,舍去小數,如果運算量中有一個是實型,則結果為雙精度實型。
例1:
#include <stdio.h>
void main()
{
 printf("%f\n",3.0/4);
}

例2:

#include <stdio.h>
void main()
{
 printf("\n\n%d,%d\n",20/7,20/7);
 printf("%f,%f\n",20.0/7,-20.0/7);
}

 

例3:
#include <stdio.h>
void main()
{
 printf("%d\n",100%3);
}

2、運算符的優先級:C語言中,運算符的優先級共分十五級。一級最高,十五級最低。在表達式中,優先級較高的先於優先級較低的進行運算。而當兩運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。

 

3、運算符的結合性:C語言中各運算符的結合性分為兩種,即左結合性和右結合性。如:x=y=2,由於“=”的右結合性,應先執行y=2再執行x=(y= 2)運算。
優先級 運算符 名稱或含義 使用形式 結合方向 說明
1 [] 數組下標 數組名[常量表達式] 左到右  
() 圓括號 (表達式)/函數名(形參表)  
. 成員選擇(對象) 對象.成員名  
-> 成員選擇(指針) 對象指針->成員名  
2 - 負號運算符 -常量 右到左 單目運算符
(type) 強制類型轉換 (數據類型)表達式  
++ 自增運算符 ++變量名 單目運算符
-- 自減運算符 --變量名 單目運算符
* 取值運算符 *指針變量 單目運算符
& 取地址運算符 &變量名 單目運算符
! 邏輯非運算符 !表達式 單目運算符
~ 按位取反運算符 ~表達式 單目運算符
sizeof 長度運算符 sizeof(表達式)  
3 / 表達式/表達式 左到右 雙目運算符
* 表達式*表達式 雙目運算符
% 余數(取模) 整型表達式%整型表達式 雙目運算符
4 + 表達式+表達式 左到右 雙目運算符
- 表達式-表達式 雙目運算符
5 << 左移 變量<<表達式 左到右 雙目運算符
>> 右移 變量>>表達式 雙目運算符
6 > 大於 表達式>表達式 左到右 雙目運算符
>= 大於等於 表達式>=表達式 雙目運算符
< 小於 表達式<表達式 雙目運算符
<= 小於等於 表達式<=表達式 雙目運算符
7 == 等於 表達式==表達式 左到右 雙目運算符
!= 不等於 表達式!= 表達式 雙目運算符
8 & 按位與 表達式&表達式 左到右 雙目運算符
9 ^ 按位異或 表達式^表達式 左到右 雙目運算符
10 | 按位或 表達式|表達式 左到右 雙目運算符
11 && 邏輯與 表達式&&表達式 左到右 雙目運算符
12 || 邏輯或 表達式||表達式 左到右 雙目運算符
13 ?: 條件運算符 表達式1? 表達式2: 表達式3 右到左 三目運算符
14 = 賦值運算符 變量=表達式 右到左  
/= 除后賦值 變量/=表達式  
*= 乘后賦值 變量*=表達式  
%= 取模后賦值 變量%=表達式  
+= 加后賦值 變量+=表達式  
-=
減后賦值 變量-=表達式  
<<=
左移后賦值 變量<<=表達式  
>>= 右移后賦值 變量>>=表達式  
&= 按位與后賦值 變量&=表達式  
^= 按位異或后賦值 變量^=表達式  
|= 按位或后賦值 變量|=表達式  
15 , 逗號運算符 表達式,表達式,… 左到右 從左向右順序運算
 4、自增自減運算符:自增1運算符記為“++”,功能是使變量的值自證1。自減1運算符記為“--”,功能是使變量值自減。自增1,自減1運算符均為單目運算符,都具有右結合性。可有以下幾種形式:
++i     i自增1后再參與其他運算;
--i       i自減1后再參與其他運算;
i++     i參與運算后,i的值再自增1;
i--       i參與運算后,i的值再自減1。
在理解和使用上易出錯的是i++和i--。特別是當它們出現在較復雜的表達式或語句中時,常常難於弄清,因此應仔細分析。
例4:
#include <stdio.h>

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

注:負號不傳導。

例5:

 
#include <stdio.h>

void main()
{
    int i=5,j=5,p,q;
    p=(i++)+(i++)+(i++);  //這里i被視為5,運算結束后再自增變為8
    q=(++j)+(++j)+(++j); //這里j先自增為8在進行運算
    printf("%d,%d,%d,%d",p,q,i,j);
}

注:有的編譯系統按照自左向右順序執行括號內的運算,求解完第1個括號的值后會實現i的自加,i值變為6,再求第2個括號的值,結果表達式相當於6+7+8,即21。而另外一些系統(如Turbo C和MS C)把3作為表達式中所有i的值,因此3個i相加,得到表達式的值為15。在求出整個表達式的值后i變量再實現自加3次,i的值變為8。

5、賦值運算和賦值表達式:(1)簡單賦值運算符記為“=‘。由”=“連接的式子稱為賦值表達式。其一般形式為:變量=表達式。例如:x=a+b

賦值表達式的功能是計算表達式的值再賦予左邊的變量。賦值運算符具有右結合性。因此a=b=c=5可理解為a=(b=(c=5))。

(2)類型轉換:如果賦值運算符兩邊的數據類型不相同,系統將自動進行類型轉換,即把賦值號右邊的類型轉換為左邊的類型,具體規定如下:

a、實型賦予整型,舍去小數部分;

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

c、字符型賦予整型,由於字符型為一個字節,而整型占兩個字節,故將字符的ASCII碼值放到整型量的低八位中,高八位為0。整型賦予字符型,只把低八位賦予字符量。

例6

#include <stdio.h>

void main()
{
    int a,b=322;
    float x,y=8.88;
    char cl='k',c2;
    a=y;           //a=y=8
    x=b;           //x=b=322.000000
    a=cl;          //a=y=cl='k'=107(ASCII表中107為k)
    c2=b;          //c2=b=322=101000010(二進制)→字符型只存后八位=01000010=B(ASCII)
    printf("%d,%f,%d,%c",a,x,a,c2);
}

(3)復合的賦值運算符:在賦值符”=“之前加上其他二目運算符可構成符合賦值符。如:+=、-=、*=、/=、%=、<<=、&=、^=等。

例:a+=5 等價於 a=a+5、x*=y+7 等價於 x=x*(y+7)

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

(6)逗號運算符和逗號表達式:在C語言中逗號“,”也是一種運算符,稱為逗號運算符,其功能是把兩個表達式連起來組成一個表達式,稱為逗號表達式。其一般形式為:表達式1,表達式2;

其求值過程是分別求兩個表達式的值,並以表達式2的值作為整個逗號表達式的值。

例7

#include <stdio.h>

void main()
{
    int a=2,b=4,c=6,x,y;
    y=((x=a+b),(b+c));   //注:=的優先級比,要高,所以逗號表達式要記得加括號
    printf("y=%d,x=%d",y,x);
}

注:(1)逗號表達式中的表達式1和表達式2也可以是又是逗號表達式。例:(表達式1,(表達式2,表達式3));

(2)程序中出現逗號表達式通常是要分別求逗號表達式內個表達式的值,並不一定要求整個逗號表達式的值。

(3)並不是所有出現逗號表達式的地方都組成逗號表達式,如在變量說明中,函數參考表中逗號只是用作各變量之間的間隔符。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM