一、賦值運算子
賦值語句的作用是把某個常量或變數或表示式的值賦值給另乙個變數。符號為『=』。這裡並不是等於的意思,只是賦值,等於用『==』表示。
注意:賦值語句左邊的變數在程式的其他地方必須要宣告。
得已賦值的變數我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表示式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。
例如:count=5;
total1=total2=0;
第乙個賦值語句大家都能理解。
第二個賦值語句的意思是把0同時賦值給兩個變數。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然後total1=total2;那麼我們這樣行不行呢?
(total1=total2)=0;
這樣是不可以的,因為先要算括號裡面的,這時total1=total2是乙個表示式,而賦值語句的左邊是不允許表示式存在的。
二、算術運算子
在c語言中有兩個單目和五個雙目運算子。
符號 功能
+ 單目正
- 單目負
* 乘法
/ 除法
% 取模
+ 加法
- 減法
下面是一些賦值語句的例子, 在賦值運算子右側的表示式中就使用了上面的算術運算子:
area=height*width;
num=num1+num2/num3-num4;
運算子也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。
取模運算子(%)用於計算兩個整數相除所得的餘數。例如:
a=7%4;
最終a的結果是3,因為7%4的餘數是3。
那麼有人要問了,我要想求它們的商怎麼辦呢?
b=7/4;
這樣b就是它們的商了,應該是1。
也許有人就不明白了,7/4應該是1.75,怎麼會是1呢?這裡需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中乙個數變為非整數。
那麼怎樣由乙個實數得到它的整數部分呢?這就需要用強制型別轉換了。例如:
a=(int) (7.0/4);
因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那麼思考一下a=(float) (7/4);最終a的結果是多少?
單目減運算子相當於取相反值,若是正值就變為負值,若是負數就變為正值。
單目加運算子沒有意義,純粹是和單目減構成一對用的。
三、邏輯運算子
邏輯運算子是根據表示式的值來返回真值或是假值。其實在c語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。
符號 功能
&& 邏輯與
|| 邏輯或
! 邏輯非
例如:5!3;
0||-2&&5;
!4;當表示式進行&&運算時,只要有乙個為假,總的表示式就為假,只有當所有都為真時,總的式子才為真。當表示式進行||運算時,只要有乙個
為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!)運算是把相應的變數資料轉換為相應的真/假值。若原先為假,則邏輯非以後為真,
若原先為真,則邏輯非以後為假。
還有一點很重要,當乙個邏輯表示式的後一部分的取值不會影響整個表示式的值時,後一部分就不會進行運算了。例如:
a=2,b=1;
a||b-1;
因為a=2,為真值,所以不管b-1是不是真值,總的表示式一定為真值,這時後面的表示式就不會再計算了。
四、關係運算子
關係運算子是對兩個表示式進行比較,返回乙個真/假值。
符號 功能
> 大於
= 大於等於
>= 右移賦值
&= 位邏輯與賦值
|= 位邏輯或賦值
^= 位邏輯異或賦值
上面的十個復合賦值運算子中,後面五個我們到以後位運算時再說明。
那麼看了上面的復合賦值運算子,有人就會問,到底total=total+3;與total+=3;有沒有區別?答案是有的,對於a=a+1,表示式a被
計算了兩次,對於復合運算子a+=1,表示式a僅計算了一次。一般的來說,這種區別對於程式的執行沒有多大影響,但是當表示式作為函式的返回值時,函式就
被呼叫了兩次(以後再說明),而且如果使用普通的賦值運算子,也會加大程式的開銷,使效率降低。
七、條件運算子
條件運算子(?:)是c語言中唯一的乙個三目運算子,它是對第乙個表示式作真/假檢測,然後根據結果返回兩外兩個表示式中的乙個。
?:在運算中,首先對第乙個表示式進行檢驗,如果為真,則返回表示式2的值;如果為假,則返回表示式3的值。
例如:a=(b>0)?b:-b;
當b>0時,a=b;當b不大於0時,a=-b;這就是條件表示式。其實上面的意思就是把b的絕對值賦值給a。
八、逗號運算子
在c語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後乙個表示式的值。
假設b=2,c=7,d=5,
a1=(++b,c--,d+3);
a2=++b,c--,d+3;
對於第一行**,有三個表示式,用逗號分開,所以最終的值應該是最後乙個表示式的值,也就是d+3,為8,所以a=8。對於第二行**,那麼也是有三個表
達式,這時的三個表示式為a2=++b、c--、d+3,(這是因為賦值運算子比逗號運算子優先順序高)所以最終表示式的值雖然也為8,但a2=3。
還有其他的如位邏輯運算子,位移運算子等等,我們等到講位運算時再說明。
九、優先順序和結合性
從上面的逗號運算子那個例子可以看出,這些運算子計算時都有一定的順序,就好象先要算乘除後算加減一樣。優先順序和結合性是運算子兩個重要的特性,結合性又稱為計算順序,它決定組成表示式的各個部分是否參與計算以及什麼時候計算。
下面是c語言中所使用的運算子的優先順序和結合性:
優先順序 運算子 結合性
(最高) () -> . 自左向右
! ~ ++ -- + - * & sizeof 自右向左
* / % 自左向右
+ - 自左向右
> 自左向右
>= 自左向右
== != 自左向右
& 自左向右
^ 自左向右
| 自左向右
&& 自左向右
|| 自左向右
?: 自右向左
= += -= *= /= %= &= ^= |= >= 自右向左
(最低) , 自左向右
在該表中,還有一些運算子我們沒有介紹,如指標運算子、sizeof運算子、陣列運算子等等
C語言的 運算子
在類函式巨集中 帶引數的巨集 號作為乙個預處理運算子,可以把記號轉換成字串。下面是乙個類函式巨集 define psqr x printf the square of x is d.n x x 假設這樣使用巨集 psqr 8 輸出為 the square of x is 64.注意雙引號字串中x被視...
C語言運算子及優先等級
bitblog 發表於 2007 2 1 14 47 00 0 推薦 c語言中的運算子及其優先順序 優先順序運算子名稱或含義 使用形式 結合方向說明1 陣列下標 陣列名 常量表示式 左到右 圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員名 成員選擇 指標 物件指標 成員名2 負號運算子 ...
C語言運算子及優先等級
bitblog 發表於 2007 2 1 14 47 00 0 推薦 c語言中的運算子及其優先順序 優先順序運算子名稱或含義 使用形式 結合方向說明1 陣列下標 陣列名 常量表示式 左到右 圓括號 表示式 函式名 形參表 成員選擇 物件 物件.成員名 成員選擇 指標 物件指標 成員名2 負號運算子 ...