C語言編程0基礎學習歷程(5)—— C的運算與表達式
目錄
在C語言中由算數運算符與其操作數組成的表達式稱爲算術表達式。
1、運算符類別
其中只需要一個操作數的運算符稱爲一元運算符,需要兩個操作數的運算符稱爲二元運算符,需要三個操作數的運算符稱爲三元運算符(或三目運算符)。條件運算符是C語言中唯一一個三目運算符。
2、除法運算
不同於數學運算,C語言中分爲整數除法和浮點數除法兩大類,前者所得結果爲餘數可能不爲零時整數商,後者爲餘數爲零的浮點數商。舉個例子,12 / 5結果爲2 ,但 12.0 / 5 結果爲2.400000。
例:
#include <stdio.h>
int main()
{
int a=12;
float b=12.0;
a=a/5;
b=b/5;
printf("%d\n%f",a,b);
return 0;
}
運行結果:
3、求餘運算
在C語言中求餘運算僅限於兩個操作數爲整數的情況,浮點數不可參與求餘運算。求餘運算的結果爲二者整除後的餘數,求餘運算常被用作取模,以限定數據範圍。
4、複合的賦值運算符
複合的賦值運算符即爲簡寫的賦值方式,這樣書寫不僅簡潔,而且執行效率更高一些。
注:複合運算符之間不應存在空格。
5、增一和減一運算符
對變量實行增一或減一是一種很常見的操作,爲此C語言專門提供了執行這種功能的運算符,即增一運算符(自增運算符)和減一運算符(自減運算符)。其操作數具有左值性質,必須是變量,不可爲常量或表達式。
當自增(自減)運算符寫在變量前時稱爲前綴運算符,是在變量使用之前先對其進行加一(減一)操作,寫在後面即爲後綴運算符,是在變量是使用之後對其進行加一(減一)操作。此操作生成的代碼比等價的賦值運算生成的代碼執行效率更高一些。
例:
#include <stdio.h>
int main()
{
int a=1;
int b=1;
printf("%d\n%d\n",a++,++b);
printf("%d\n%d\n",a,b);
return 0;
}
運行結果:
6、 宏常量與宏替換
衆所周知,π是一個常量,其大小約爲3.14159,常用於圓類的面積計算中,假如我們需要寫一個有關計算圓面積和周長的程序,其中多次需要調用π這個數的數值,我們應該怎麼辦?
一般的想法是在每處π出現的地方寫入3.14159,但如果我們想改變π的精度呢,難道要一個一個進行修改麼?這未免也太麻煩了。那麼如何解決這個問題呢?這就要用到宏常量和宏替換了。
宏常量也稱爲符號常量,是指用一個標識符號來表示的常量。其一般形式爲:#define 標識符 字符串 (最後沒有分號結尾)
例:
#include <stdio.h>
#define PI 3.14159
int main()
{
int a=1;
int b=2;
double areaA=a*a*PI;
double areaB=b*b*PI;
printf("%lf,%lf\n",areaA,areaB);
return 0;
}
運行結果:
宏定義中的標識符被稱爲宏名,將程序中出現的宏名替換成字符串的過程叫做宏替換。
7、const常量
使用宏常量最大的問題是,宏常量沒有數據類型,編譯時僅僅是進行簡單的字符串替換,而字符串替換時常遇到意想不到的問題。爲解決這個問題,就要引入const常量。
只要將const類型修飾符放在類型名之前,即可將類型名後的標識符聲明爲具有該類型的const常量。由於編譯器將其放在只讀存儲區,不允許在程序中改變其值,因此const常量只允許在定義時賦初值。
例:
#include <stdio.h>
const double PI=3.14159;
int main()
{
int a=1;
int b=2;
double areaA=a*a*PI;
double areaB=b*b*PI;
printf("%lf,%lf\n",areaA,areaB);
return 0;
}
運行結果:
8、自動類型轉換
請讀者思考一下這樣的問題,如果兩種不同類型的操作數進行運算,運算結果會是什麼類型呢?
C編譯器會將所有操作數轉換爲取值範圍較大的操作數類型,稱爲類型提升。規則如下:
(能力有限,關係圖不甚美觀,望諒解)
如果是賦值時遇到左右側類型不同,則將右側表達式的值轉換爲左側變量的類型。當然,由小到大的進行類型轉換時是合理的,但如果反過來將出現一些問題。
附:
表1
左側變量類型 | 右側表達式類型 | 可能丟失的信息 |
---|---|---|
singed char | char | 當值大於127時,轉換結果爲負數 |
char | short | 高8位 |
char | int (16位) | 高8位 |
char | int (32位) | 高24位 |
char | long | 高24位 |
short | int(16位) | 無 |
short | int(32位) | 高16位 |
int(16位) | long | 高16位 |
int(32位) | long | 無 |
int | float | 小數部分 |
float | double | 精度 |
double | long double | 精度 |
9、強制類型轉換
格式:(類型)表達式。使用強制類型轉換可以明確表示程序打算執行何種類型轉換。