運算子和表示式

2021-10-06 10:30:22 字數 3159 閱讀 1707

幾乎每乙個程式都需要進行運算,對資料進行加工處理,否則程式就沒有意義了。要進行運算,就需規定可以使用的運算子。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("%d\n",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**。有此思路就可以編寫程式了。

編寫程式:

#includeint main()

執行結果: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還提供其他運算子,共有以下幾類:

運算子和表示式

運算子 1.算術運算子 定義 int i 2 1 i i 是在 使用完畢之後 2 i i 是在 之後使用 3 i i 是 3 3 是形成運算子的 4 函式是從右邊開始傳參,其中,為結束標誌 例子1 func i i i i,i 6,5,4,i,2 i最後是 7 6 5 4 7 2 例子2 i i i...

運算子和表示式

有些運算子需要兩個運算元,使用形式為 運算元 運算子 運算元,這樣的運算子就叫做二元運算子或雙目運算子,只需要乙個運算元的運算子叫做一元運算子或單目運算子。運算子具有優先順序和結合性。如果乙個表示式中有多個運算子則先進行優先順序高的運算,後進行優先順序低的運算。結合性就是指當乙個運算元左邊和右邊的運...

運算子和表示式

分享一下在c語言中運算子和表示式 1.算數運算子和算數表示式 算數 就是我們平時日常生活中的加減乘除等。在c語言中的運算符號分別為如下 加 減 乘 除 取餘 在計算機運算中也是有符號優先順序,先乘除後加減,有括號先算括號裡面的 自左向右 和平時演算法是一樣的。舉例子 2 9 7 2 8 在這個中我們...