今天談到的知識(shí)其實(shí)之前或多或少都接觸過(guò)了,我們?cè)侔阉硪幌隆>幊讨袔讉€(gè)基本的動(dòng)作是運(yùn)算纵穿、判斷和比較,我們接下來(lái)的內(nèi)容就重點(diǎn)學(xué)習(xí)這些奢人。
一谓媒,算術(shù)運(yùn)算符
算術(shù)運(yùn)算符分為單目和雙目操作:
- 單目操作是指對(duì)一個(gè)操作數(shù)進(jìn)行操作。例如: -a是對(duì)a進(jìn)行一目負(fù)操作何乎。
- 雙目操作(或多目操作)是指兩個(gè)操作數(shù)(或多個(gè)操作數(shù))進(jìn)行操作句惯。
1.雙目運(yùn)算符
這個(gè)比較好理解土辩,如同數(shù)學(xué)中的運(yùn)算符號(hào)。
+ : 加法運(yùn)算
- : 減法運(yùn)算
* : 乘法運(yùn)算
/ : 除法運(yùn)算
% : 求余運(yùn)算(又叫模運(yùn)算)
重點(diǎn)說(shuō)一下后兩個(gè)運(yùn)算符:
- 除法運(yùn)算符左右兩邊的數(shù)據(jù)類型決定了運(yùn)算結(jié)果的類型宗弯。兩邊都是整數(shù)結(jié)果為整數(shù)脯燃,有任一方是小數(shù),結(jié)果為小數(shù)蒙保。如果兩個(gè)整數(shù)相除有余數(shù),舍棄余數(shù)欲主。運(yùn)算符右邊的數(shù)不能為0
- 整除運(yùn)算符左右兩邊的數(shù)據(jù)必須都是整數(shù)邓厕,結(jié)果是這兩個(gè)數(shù)相除的余數(shù)值。如果能整除扁瓢,結(jié)果為0
下面我們用一段代碼說(shuō)明這四個(gè)運(yùn)算符的用法:
int a = 3;
int b = 2;
int sum, diff, product, res, mod;
// +
sum = a + b;
printf("sum = %d\n", sum);
// -
diff = a - b;
printf("diff = %d\n", diff);
// *
product = a * b;
printf("product = %d\n", product);
// /
res = a / b;
printf("res = %d\n", res);
// %
mod = a % b;
printf("mod = %d\n", mod);
這段代碼的結(jié)果如下:
2. 單目運(yùn)算符
C語(yǔ)言中有兩個(gè)很有用的單目運(yùn)算符详恼。這兩個(gè)運(yùn)算符就是增1和減1運(yùn)算符"++"和"--"。
- ++ 操作數(shù)加1
- -- 操作數(shù)減1
如:
x = x + 1;
x++;
++x;
這三句意義相同引几。
x = x - 1;
x--;
--x;
這三句意義也相同昧互。
自增和自減運(yùn)算需要注意這樣的問(wèn)題:
x = m++;
x = ++m;
這兩句的結(jié)果完全不同。
x = m++; // 表示將m的值賦給x后, m加1伟桅。
x = ++m; // 表示m先加1后, 再將新值賦給x敞掘。
我們看一下這段代碼:
int a = 1;
int b = 1;
int ret;
ret = a++;
printf("ret = %d, a = %d\n", ret, a);
ret = ++b;
printf("ret = %d, b = %d\n", ret, b);
結(jié)果如下:
關(guān)于 -- 的程序大家自己實(shí)現(xiàn)一下,看看會(huì)是神馬結(jié)果楣铁。
如果你對(duì)運(yùn)算符還有什么疑問(wèn)玖雁,請(qǐng)修改這些代碼,驗(yàn)證你的疑問(wèn)盖腕。通過(guò)代碼學(xué)習(xí)永遠(yuǎn)是最好的方法赫冬。
二、賦值語(yǔ)句中的數(shù)據(jù)類型轉(zhuǎn)換
1. 賦值運(yùn)算符
這個(gè)大家都很熟悉溃列,就是“=”劲厌。它的作用是把右邊的值或計(jì)算結(jié)果賦給左邊的變量。如:
int a = 0;
int a = b + c;
賦值運(yùn)算有一種特殊的寫法:
int a = 0;
a = a + 5;
a += 5;
a = a - 3;
a -= 3;
第二行和第三行意思相同听隐,第四行和第五行意思相同补鼻,可以互相替換。這是一種C語(yǔ)言中的簡(jiǎn)便寫法遵绰。
2. 類型轉(zhuǎn)換
類型轉(zhuǎn)換是指不同類型的變量混用時(shí)的類型改變辽幌。
2.1 隱式類型轉(zhuǎn)換
基本原則:
- 在賦值語(yǔ)句中, 等號(hào)右邊的值轉(zhuǎn)換為等號(hào)左邊變量所屬的類型
- 不同類型混合計(jì)算時(shí),結(jié)果類型為數(shù)據(jù)類型級(jí)別較高的
- 所有的浮點(diǎn)預(yù)算都是以double進(jìn)行的
數(shù)據(jù)類型級(jí)別順序:
char, short < int < float < double
請(qǐng)看下面這段代碼:
main()
{
int a, b = 3;
float f = 1.5;
a = f * b; // 整數(shù)和浮點(diǎn)類型運(yùn)算椿访,結(jié)果為浮點(diǎn)類型乌企,因?yàn)樗愋图?jí)別高
printf("a = %d\n", a);
a = f; // 把一個(gè)浮點(diǎn)類型的變量賦值給整數(shù)類型,小數(shù)部分會(huì)被自動(dòng)舍去
printf("a = %d\n", a);
}
這段程序的運(yùn)行結(jié)果為:
a = 4
a = 1
其他類型賦值時(shí)的隱式轉(zhuǎn)換請(qǐng)大家自己編程實(shí)驗(yàn)成玫。
這里有個(gè)重點(diǎn)問(wèn)題需要強(qiáng)調(diào)加酵,浮點(diǎn)類型的和整數(shù)類型計(jì)算時(shí)拳喻,結(jié)果為浮點(diǎn)類型。我們看一個(gè)常見問(wèn)題猪腕。
main()
{
float f;
int a = 5;
f = a / 2;
printf("f = %f\n", f);
}
這段程序的運(yùn)行結(jié)果是:
f = 2.0000
原因在于冗澈,a是個(gè)整數(shù),2也是個(gè)整數(shù)陋葡,它們的計(jì)算結(jié)果也是整數(shù)亚亲。此時(shí),就已經(jīng)舍棄了計(jì)算結(jié)果中的小數(shù)部分腐缤。因此捌归,賦值時(shí)就自然沒有小數(shù)部分。
如果我們需要得到f = 2.5怎么辦呢岭粤?可以這樣寫:
main()
{
float f;
int a = 5;
f = a / 2.0;
printf("f = %f\n", f);
}
因?yàn)檎麛?shù)a和浮點(diǎn)數(shù)2.0計(jì)算的結(jié)果是浮點(diǎn)型(double)惜索,因此保留了小數(shù)部分。之后再把=右邊的double類型轉(zhuǎn)換成左邊的float類型剃浇。仔細(xì)想想巾兆,能理解吧。
2.2 強(qiáng)制類型轉(zhuǎn)換
在計(jì)算中虎囚,我們常常需要主動(dòng)要求計(jì)算機(jī)改變變量的類型角塑。這是可以這樣做。
(數(shù)據(jù)類型)(表達(dá)式或變量)
按照這種格式寫溜宽,右邊部分的類型就會(huì)被強(qiáng)制轉(zhuǎn)換成左邊括號(hào)中的類型吉拳。看看具體代碼:
main()
{
float f;
f = 6.6 / 3;
printf("f = %f\n", f);
f = (int)6.6 / 3;
printf("f = %f\n", f);
f = (int)(6.6 / 3);
printf("f = %f\n", f);
}
結(jié)果如圖所示:
重點(diǎn)說(shuō)一下 f = (int)6.6 / 3;和f = (int)(6.6 / 3);的區(qū)別适揉,前者是把6.6轉(zhuǎn)成int型留攒,變成6之后再計(jì)算。后者是先計(jì)算6.6 / 3嫉嘀,得到結(jié)果2.2炼邀,之后再?gòu)?qiáng)行轉(zhuǎn)換成int型。
今天先說(shuō)到這里剪侮,其他的運(yùn)算符下次再聊拭宁。
很多朋友來(lái)信說(shuō)希望講一些難度更高的知識(shí)點(diǎn),不知道大家是否覺得這個(gè)系列講得太基礎(chǔ)瓣俯。
我在這里做個(gè)簡(jiǎn)單調(diào)查杰标,覺得前幾篇有收獲的同學(xué)請(qǐng)留言告訴我,覺得過(guò)于基礎(chǔ)的同學(xué)請(qǐng)留言說(shuō)明你們希望講些什么知識(shí)點(diǎn)彩匕。
我是天花板腔剂,讓我們一起在軟件開發(fā)中自我迭代。
如有任何問(wèn)題驼仪,歡迎與我聯(lián)系掸犬。