幾乎每乙個程式都需要進行運算,對資料進行加工處理,否則程式就沒有意義了。要進行運算,就需規定可以使用的運算子。c語言的運算子範圍很寬,把除了控制語句和輸入輸出以外的幾乎所有的基本操作都作為運算子處理,例如將賦值符「=」作為賦值運算子、方括號作為下標運算子等。
1、基本的算術運算子
最常見的算術運算子見下表
2、自增、自減運算子作用是使變數的值加1或減1,例如:++i,--i(在使用i之前,先使i的值加(減)1)
i++,i--(在使用i之後,先使i的值加(減)1)
粗略地看,++i和i++的作用相當於i=i+1。但++i和i++不同之處在於++i是先執行i=i+1後,再使用i的值;而i++是先使用i的值後,再執行i=i+1.如果i的原值等於3,分析下面的賦值語句:
又例如:i=3;printf("%d",++i);輸出4.
若改為printf("%dn",i++);則輸出3.
3、算術表示式和運算子的優先順序與結合性
用算術運算子和括號將運算物件(也稱運算元)連線起來的,符合c語法規則的式子,稱為c算術表示式。運算物件包括常量、變數、函式等。例如下面是乙個合法的c算術表示式:a*b/c-1.5+'a'.
c語言除了規定了運算子的優先順序外,還規定了運算子的結合性。在表示式求值時,先按運算子的優先順序順序執行,例如先乘除後加減。如表示式a-b*c,b的左側為減號,右側為乘號,而乘號優先順序高於減號,因此相當於a-(b*c).
如果在乙個運算物件兩側的運算子的優先順序相同,如a-b+c,則按規定的「結合方向」處理。c語言規定了各種運算子的結合方向(結合性),算術運算子的結合方向都是「自左向右」,即先左後右,因此b先與減號結合,執行a-b的運算,然後再執行加c的運算。
「自左至右的結合方向」又稱「左結合性」,即運算物件先與左面的運算子結合。以後可以看到有些運算子的結合方向為「自右至左」,即右結合性。
4、不同型別資料間的混合運算
在程式中經常會遇到不同型別的資料進行運算,如果乙個運算子的兩側的資料型別不同,則先自動進行型別轉換,使二者具有同一種型別,然後進行運算。因此整型、實型、字元型資料間可以進行混合運算。規律為:
(1) +、-、*、/運算的兩個數中有乙個數為float或double型,結果是double型,因為系統將所有float型資料都先轉換為double型,然後進行運算。
(2) 如果int型與float或double型資料進行運算,先把int型和float型資料轉換為double型,然後進行運算,結果是double型。
(3) 字元(char)型資料與整型資料進行運算,就是把字元的ascii**與整型資料進行運算。如:12+'a',由於字元a的ascii**是65,相當於12+65,等於77.字元資料可以直接與整型資料進行運算。如果字元型資料與實型資料進行運算,則將字元的ascii**轉換為double型資料,然後進行運算。
以上的轉換是編譯系統自動完成的,使用者不必過問。
例:給定乙個大寫字母,要求用小寫字母輸出。
解題思路:前面已介紹,字元資料以ascii碼儲存在記憶體的,形式與整數的儲存形式相同。所以字元型資料和其他算術型資料之間可以互相賦值和運算。
要進行大小寫字母之間的轉換,就要找到乙個字母的大寫形式和小寫形式之間有什麼內在聯絡。實際上我們通過查詢資料發現其內在規律,即同乙個字母,用小寫表示的字元的ascii**比用大寫表示的字元的ascii**大32。例如字元'a'的ascii**為97,而'a'的ascii**為65.將'a'的ascii**加32,就能得到'a'的ascii**。有此思路就可以編寫程式了。
編寫程式:
#include
執行結果:a程式分析:程式第6行「c2=c1+32」,把字元變數c1的值與整數32相加。c1+32就是'a'+32,就是65+32,其值為97.將97賦給字元變數c2,在c2的儲存單元中存放了97(以二進位制形式儲存)。
乙個字元資料既可以以字元形式輸出,也可以以整數形式輸出。第7行的目的是以字元形式輸出c2,在printf函式中指定用「%c」格式,系統會將c2變數的值97轉換成相應字元'a',然後輸出。最後一行的目的是以ascii碼形式輸出c2的值,故指定用「%d」輸出格式,得到97。
5、強制型別轉換運算子可以利用強制型別轉換運算子將乙個表示式轉換成所需型別。例如:(double)a (將a轉換成double型別)(int)(x+y) (將x+y的值轉換成int型)(float)(5%3) (將5%3的值轉轉成float型)其一般形式為:(型別名)(表示式)注意,表示式應該用括號括起來。如果寫成(int)x+y,則只將x轉換成整型,然後與y相加。
需要說明的是,在強制型別轉換時,得到乙個所需型別的中間資料,而原來變數的型別未發生變化。例如:a=(int)x
如果已定義x為float型變數,a為整型變數,進行強制型別運算(int)x後得到乙個int型別的臨時值,它的值等於x的整數部分,把它賦給a,注意x的值和型別都未變化,仍為float型。該臨時值在賦值後就不再存在了。
從上可知,有2種型別轉換,一種是在運算時不必使用者干預,系統自動進行的型別轉換,如3+6.5.第2種是強制型別轉換。當自動型別轉換不能實現目的時,可以用強制型別轉換。如%運算子要求其兩側均為整型量,若x為float型,則x%3不合法,必須用(int)x%3,強制型別轉換運算優先於%運算子,因此先進行(int)x的運算,得到乙個整型的中間變數,然後再對3求餘,此外在函式呼叫時,有時為了使實參與形參型別一致,可以用強制型別轉換運算子得到乙個所需型別的引數。
6、c運算子
除了算術運算子外,c還提供其他運算子,共有以下幾類:
如何過載自增運算子 和自減運算子
如何過載增量運算子 和 運算子 和 有前置和後置兩種形式,如果不區分前置和後置,則使用operator 或operator 即可 否則,要使用operator 或operator 來過載前置運算子,使用operator int 或operator int 來過載後置運算子,呼叫時,引數int被傳遞給...
運算子優先順序 C 運算子優先順序
c 運算子優先順序 優先順序運算子 描述方向1 scope resolution 範圍解析 left to right 2 suffix postfix increment and decrement 字首 字尾遞增和遞減 function call 函式呼叫 array subscripting ...
JS運算子和運算子優先順序
先做一道題 var val abcd console.log value is val abcd a b 控制台列印出的結果是 a 因為連線符的優先順序高於三元運算子,所以該題目相當於 value is true a b 由此得出該題的兩個變體 console.log value is val ab...