作者 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)桐款。
轉(zhuǎn)載請注明出處绪钥。
原文:http://www.reibang.com/p/7bc4493ebb4f
《C語言探索之旅》全系列
內(nèi)容簡介
- 前言
- 基礎(chǔ)運(yùn)算
- 變量之間的運(yùn)算
- 縮寫
- 數(shù)學(xué)庫
- 總結(jié)
- 第一部分第八課預(yù)告
1. 前言
上一課是 C語言探索之旅 | 第一部分第六課:變量的世界(三),顯示變量內(nèi)容 忱详。
今天虚汛,我們一起來學(xué)習(xí) C語言(對大多數(shù)編程語言也類似)中的運(yùn)算匾浪。
之前的課中,我們已經(jīng)說過:電腦是一臺“笨笨”的機(jī)器卷哩,只會做計(jì)算户矢。
不管你是用電腦來聽音樂,還是用電腦來看電影殉疼,玩游戲梯浪,其實(shí)電腦只是在做運(yùn)算。不然怎么叫“計(jì)算機(jī)”呢瓢娜?
這一課我們一起來學(xué)習(xí)電腦能實(shí)現(xiàn)的大多數(shù)運(yùn)算挂洛。我們會繼續(xù)使用上一課學(xué)到的變量的知識。其實(shí)眠砾,就是對變量做加虏劲,減,乘,除柒巫,取模励堡,等等各種操作。
即使你對數(shù)學(xué)不感興趣堡掏,這一課也是必不可少的应结。硬著頭皮上吧~
2. 基礎(chǔ)運(yùn)算
說到基礎(chǔ)運(yùn)算,無外乎:
- 加
- 減
- 乘
- 除
- 取模 (如果你是第一次聽說泉唁,不用擔(dān)心鹅龄,我們后面會解釋)
其實(shí)你的電腦也只知道做這些基礎(chǔ)運(yùn)算,如果你要它做更復(fù)雜的運(yùn)算(平方亭畜,乘方扮休,對數(shù),等)拴鸵,那你需要編程才行玷坠,就是說你需要向電腦解釋怎么做。
但是劲藐,很幸運(yùn)的是八堡,在這一課中我們會看到其實(shí) C語言已經(jīng)設(shè)計(jì)好了數(shù)學(xué)庫(關(guān)于庫的知識,請看以前的課程瘩燥。簡單地說就是已經(jīng)編寫好的,可以供你的程序調(diào)用的各種變量和函數(shù)的集合)不同,你只要用專家定義好的庫里面的內(nèi)容就好了厉膀,不需要自己重復(fù)“造輪子”。
一開始二拐,我們從加法開始看吧服鹅。
為了在 C語言中做加法,我們要用到 + 號百新。不開玩笑企软,就是這么簡單。
你要把加法的結(jié)果放到一個變量里面饭望。我們就來創(chuàng)建一個整數(shù)類型的變量仗哨,取名叫 result(表示“結(jié)果”)。
int result = 0;
result = 4 + 6;
不必是專業(yè)數(shù)學(xué)家铅辞,也可以猜想到程序運(yùn)行后 result 的值會變?yōu)?10厌漂,我們用 printf 函數(shù)來輸出結(jié)果:
printf("4 + 6 = %d", result);
運(yùn)行程序,顯示:
4 + 6 = 10
看吧斟珊,加法就是這么簡單苇倡,一點(diǎn)也不任性。
對于其他的運(yùn)算類型,也是同樣的原理旨椒。只有運(yùn)算符不同晓褪,見下表:
運(yùn)算 | 符號 |
---|---|
加法 | + |
減法 | - |
乘法 | * |
除法 | / |
取模 | % |
如果你曾經(jīng)使用過電腦上的計(jì)算器,你肯定知道這些符號综慎。除了最后兩個(除和取模)涣仿,其他應(yīng)該很熟悉。我們就來說說最后兩個符號寥粹。
除法
當(dāng)沒有余數(shù)時变过,除法運(yùn)行得好好的。比如涝涤,6 / 3 等于 2媚狰,你的電腦給了你正確的答案。到這里為止還沒有問題阔拳。
但是崭孤,我們假如讓電腦做 5 / 2,按理結(jié)果應(yīng)該是 2.5糊肠。但是辨宠,來看看我們的程序:
int result = 0;
result = 5 / 2;
printf ("5 / 2 = %d", result);
運(yùn)行程序,顯示:
5 / 2 = 2
我們讓電腦計(jì)算 5 / 2货裹,期待的結(jié)果是 2.5嗤形,但是實(shí)際上電腦卻給出了 2。這不是“很二”嘛... 親愛的電腦弧圆,你怎么可以這樣對我赋兵?
其實(shí),內(nèi)有蹊蹺搔预。難道我們的電腦真的在這點(diǎn)上這么蠢笨嗎霹期?
事實(shí)上,當(dāng)電腦看到數(shù)字 5 和 2 時拯田,它會做一個整數(shù)之間的除法(也叫做“歐幾里得除法”)历造,就是說它會把結(jié)果截取一段,只留下整數(shù)部分(這里是 2)船庇。
你也許會說:“啊吭产,我知道了,都是因?yàn)?result 這個變量是整數(shù)類型嘛鸭轮。如果把 result 聲明為 double 類型的浮點(diǎn)數(shù)垮刹,那它應(yīng)該可以儲存帶小數(shù)點(diǎn)的數(shù)啦≌懦冢”
其實(shí)不然荒典,這不是原因酪劫。假如你把 result 聲明為 double 類型,運(yùn)算
result = 5 / 2寺董,你還是會得到 2覆糟。事實(shí)上,這是因?yàn)?/
運(yùn)算符兩邊的數(shù)是整數(shù)遮咖,所以電腦會做整數(shù)之間的除法滩字。
當(dāng)然,也是可以讓電腦輸出你想要的結(jié)果的御吞,怎么辦呢麦箍?看下面程序:
double result = 0;
result = 5.0 / 2.0;
printf ("5 / 2 = %f", result);
運(yùn)行,顯示:
5 / 2 = 2.500000
看到了嗎陶珠,如果要你的電腦顯示正確結(jié)果挟裂,還需要你把運(yùn)算符兩邊的數(shù)寫成 5.0 和 2.0(同樣是 5 和 2,但是電腦卻認(rèn)為這兩個是浮點(diǎn)數(shù)揍诽,因此它就做浮點(diǎn)數(shù)的除法)诀蓉。怎么樣,電腦任性不暑脆?
這個整數(shù)除法的特性很重要渠啤。所以得記住,對于電腦來說:
5 / 2 = 2
10 / 3 = 3
4 / 5 = 0
有點(diǎn)令人吃驚添吗,不是么沥曹?但這就是電腦做整數(shù)運(yùn)算的方式。
如果你想要得到浮點(diǎn)數(shù)的結(jié)果碟联,需要運(yùn)算的數(shù)本身是浮點(diǎn)數(shù)(提一下妓美,其實(shí)不需要兩個數(shù)都是浮點(diǎn)數(shù),一個是浮點(diǎn)數(shù)就夠了玄帕,電腦會自動把另一個也認(rèn)為是浮點(diǎn)數(shù)來做運(yùn)算):
5.0 / 2.0 = 2.5
10 / 3.0 = 3.33333
4.0 / 5 = 0.8
事實(shí)上部脚,在做整數(shù)除法時想邦,比如 5 / 2裤纹,你的電腦會回答下面問題:“5里面有多少個 2 ?”丧没,答案是兩個鹰椒。同樣的,“10 里面有多少個 3 呢”呕童,答案是三個漆际。
然后你又會問了,我們怎么才能獲取到除法剩下的數(shù)(余數(shù))呢夺饲?
這就要輪到取模運(yùn)算出場了奸汇。
取模
取模運(yùn)算是獲得除法的余數(shù)的一種數(shù)學(xué)運(yùn)算施符。可能相比 加擂找、減戳吝、乘、除這基本的四則運(yùn)算來說贯涎,它沒有那么被人熟知听哭,但對電腦來說,取模是基本的運(yùn)算之一塘雳。很有可能是為了解決上面提到的整數(shù)除法的難題陆盘。
上面表格里列出來了,取模的符號是 %
以下列出一些取模運(yùn)算的例子:
5 % 2 = 1
14 % 3 = 2
4 % 2 = 0
取模運(yùn)算 5 % 2 是除法運(yùn)算 5 / 2 的余數(shù)败明,所以是 1隘马。電腦計(jì)算 5 = 2 * 2 + 1
,所以取模運(yùn)算就得出 1 為結(jié)果肩刃。
同樣地祟霍,14 = 3 * 4 + 2
,所以余數(shù)為 2盈包。
4 = 2 * 2
沸呐,所以余數(shù)為 0。
好了呢燥,我宣布一個好消息:“我們已經(jīng)學(xué)了所有的基礎(chǔ)運(yùn)算了崭添。數(shù)學(xué)課下課了~”
3. 變量之間的運(yùn)算
誒,變量之間的運(yùn)算叛氨?
怎么數(shù)學(xué)老師剛走呼渣,又來了數(shù)學(xué)教授啊寞埠?沒辦法屁置,電腦又名計(jì)算機(jī),肯定要跟數(shù)學(xué)打點(diǎn)交道的嘛仁连。幸虧來的不是“叫獸”蓝角。
既然我們在上面一節(jié)中已經(jīng)學(xué)習(xí)了基礎(chǔ)的 5 種運(yùn)算,那現(xiàn)在可以來看看變量之間的運(yùn)算咯饭冬。
事實(shí)上使鹅,變量之間的運(yùn)算也是同理。
result = number1 + number2;
上面這一行代碼對 number1 和 number2 這兩個變量做加法運(yùn)算昌抠,并且把結(jié)果儲存到 result 這個變量里患朱。
現(xiàn)在我們的學(xué)習(xí)越來越有意思了。其實(shí)你現(xiàn)在已經(jīng)可以實(shí)現(xiàn)一個迷你的計(jì)算器的功能了炊苫,不要懷疑自己裁厅,你可以的冰沙。
想象一個程序,請求用戶輸入兩個數(shù)执虹,這兩個數(shù)倦淀,你將其儲存在變量里。
然后声畏,你對這兩個變量做加法撞叽,并且把結(jié)果儲存在另一個變量里。接下來插龄,你就只需要把計(jì)算的結(jié)果顯示在屏幕上就好了愿棋,讓用戶看看電腦的本領(lǐng),很多人做加法可沒有這么快速呢均牢!
試著自己編寫以上程序糠雨,很簡單的,也可以給你練手徘跪。
當(dāng)然了甘邀,我們還是把代碼寫上:
#include <stdio.h>
int main(int argc, char *argv[])
{
int result = 0, number1 = 0, number2 = 0;
// 請求用戶輸入number1和number2的值:
printf("請輸入數(shù)字1 : ");
scanf("%d", &number1);
printf("請輸入數(shù)字2 : ");
scanf("%d", &number2);
// 做運(yùn)算:
result = number1 + number2;
// 把運(yùn)算結(jié)果顯示在屏幕上 :
printf ("%d + %d = %d\n", number1, number2, result);
return 0;
}
運(yùn)行,顯示:
請輸入數(shù)字1 : 289
請輸入數(shù)字2 : 376
289 + 376 = 665
可能你還沒意識到:這是我們第一個有點(diǎn)意思的程序垮庐。我們的程序請求用戶輸入兩個數(shù)松邪,然后做加法,再把結(jié)果輸出到屏幕上哨查。很棒吧逗抑!
請你自己也試著用其他四個基礎(chǔ)運(yùn)算符來寫程序,看看結(jié)果如何寒亥。
4. 縮寫
之前我們保證過邮府,不會再有新的運(yùn)算形式出現(xiàn)了。確實(shí)如此溉奕,我們已經(jīng)知道了所有的基礎(chǔ)運(yùn)算:加褂傀、減、乘加勤、除仙辟、取模。用這些基礎(chǔ)運(yùn)算我們可以做所有事情胸竞。不需要其他的運(yùn)算了欺嗤。
我知道這很難令人相信参萄。你會說難道一個很復(fù)雜的 3D 游戲最終也是由加卫枝、減、乘讹挎、除等構(gòu)成的校赤?是的吆玖,確實(shí)如此。
雖然如此马篮,但是在 C語言里我們還可以進(jìn)行運(yùn)算的縮寫沾乘。
為什么要縮寫呢?因?yàn)楹芏鄷r候我們做的運(yùn)算都是重復(fù)的浑测。下面你就會看到縮寫的好處了翅阵。
自增運(yùn)算
你會發(fā)現(xiàn)你在編程中經(jīng)常要對一個變量進(jìn)行 +1 操作。
假設(shè)你的變量名字是 number迁央,你知道怎么對它進(jìn)行 +1 操作嗎掷匠?是這樣做的:
number = number + 1;
上面的語句做了什么呢?
首先我們做運(yùn)算 number + 1岖圈,然后我們把運(yùn)算結(jié)果儲存到變量 number (它自己)中讹语。
因此,假如我們的變量值是 4蜂科,運(yùn)算后變成 5 了顽决,假如它的值是 8,那會變成 9导匣,依此類推才菠。
這個運(yùn)算是重復(fù)的。要知道贡定,計(jì)算機(jī)科學(xué)家都是很懶的人鸠儿,他們可不希望輸入兩遍 number(確實(shí)也挺累人的)。
于是他們發(fā)明了一個縮寫形式厕氨,叫做自增運(yùn)算进每。它的結(jié)果和 +1 操作是一樣的:
number++;
這一行代碼,就是用了自增運(yùn)算符 ++命斧,是不是比剛才那句 number = number + 1
簡單了田晚?它意味著“對 number 做 +1 運(yùn)算”。
敏銳的讀者可能想到了国葬,編程語言 C++ 的 ++ 符號其實(shí)正是自增運(yùn)算符的意思贤徒。我以前也不太理解為什么不是 C+,而是 C++汇四。
原來計(jì)算機(jī)科學(xué)家跟大家開了一個很有意味的玩笑:C++ 意味著對 C 做 +1 操作接奈,表示“比 C語言多一點(diǎn)”。
當(dāng)然了通孽,事實(shí)上 C++ 只是用不同的方式來編程序宦,并不是說 C++ 比 C語言更優(yōu)秀,只是不同而已背苦。
自減運(yùn)算
知道了自加運(yùn)算的原理互捌,自減運(yùn)算應(yīng)該不難理解吧:就是對變量進(jìn)行 -1 運(yùn)算潘明。
number--;
其他的縮寫形式
同理,其他還有好幾種運(yùn)算的縮寫形式秕噪。比如 number = number * 2;
可以寫成 number *= 2;
钳降。
看以下代碼:
int number = 2;
number += 4; // number 變?yōu)?6
number -= 3; // number 變?yōu)?3
number *= 5; // number 變?yōu)?15
number /= 3; // number 變?yōu)?5
number %= 3; // number 變?yōu)?2(因?yàn)?5 = 1 * 3 + 2)
5. 數(shù)學(xué)庫
在 C語言中,我們有一些稱之為“標(biāo)準(zhǔn)庫”的東西腌巾,就是那些很實(shí)用的庫遂填。我們一般會經(jīng)常使用那些基礎(chǔ)庫。
復(fù)習(xí)一下:庫就是指已經(jīng)定義好的函數(shù)和變量的集合澈蝙。這些函數(shù)由前人寫成城菊,可以避免我們重復(fù)“造輪子”。
我們已經(jīng)使用過 stdio.h 庫中的 printf 和 scanf 這兩個函數(shù)了碉克。
其實(shí)還有很多其他很實(shí)用的庫凌唬,其中就有一個叫 math.h,里面包含了與數(shù)學(xué)相關(guān)的函數(shù)漏麦。
實(shí)際上客税,光是加、減撕贞、乘更耻、除、取模是不夠的捏膨。雖然底層都是這五個運(yùn)算秧均,但是很多時候我們需要做復(fù)雜的運(yùn)算形式,就需要調(diào)用庫或者自己寫函數(shù)了号涯。
因?yàn)殡娔X并沒辦法理解除了 +目胡,-,*链快,/誉己,% 之外的運(yùn)算符,比如你如果要電腦做乘方域蜗,輸入 5 ^ 2
韵丑,電腦完全不理解什么意思盆赤,除非你調(diào)用數(shù)學(xué)庫里已經(jīng)定義好的做乘方的函數(shù)磕秤。
調(diào)用數(shù)學(xué)庫很簡單犁珠,
#include <math.h>
只要用這一行代碼,接下來你的程序就可以用里面定義的所有函數(shù)了丝蹭。
我們介紹其中幾個最常用的吧慢宗。
fabs
這個函數(shù)返回絕對值:
- 如果你傳給這個函數(shù) -53,它會返回 53 。
- 如果你傳給這個函數(shù) 53婆廊,它會返回 53 。
double absolute = 0, number = -29;
absolute = fabs(number); // absolute 的值變?yōu)?29
ceil
這個函數(shù)返回給出的浮點(diǎn)數(shù)后面緊接的整數(shù)巫橄。這是一種舍入的方式淘邻。ceil 函數(shù)總是舍入緊鄰的比參數(shù)大的整數(shù)。
double above = 0, number = 34.81;
above = ceil(number); // above 的值變?yōu)?35
floor
這個函數(shù)與 ceil 的作用相對湘换,返回給出的浮點(diǎn)數(shù)前面緊接的整數(shù)宾舅。
double below = 0, number = 45.63;
below = floor(number); // below 的值變?yōu)?45
pow
這個函數(shù)計(jì)算數(shù)字的乘方。你要給它兩個參數(shù):底數(shù)和指數(shù)彩倚。
double result = 0, number = 2;
result = pow(number, 4); // result 的值變?yōu)?16(2 ^ 4 = 16)
sqrt
這個函數(shù)返回參數(shù)的平方根筹我。返回值是 double 類型。
double result = 0, number = 100;
result = sqrt(number); // result 的值變?yōu)?10
sin, cos, tan
這三個函數(shù)是計(jì)算正弦帆离,余弦蔬蕊,正切的值。
asin, acos, atan
這三個函數(shù)是計(jì)算反正弦哥谷,反余弦岸夯,反正切的值。
exp
這個函數(shù)是特殊的乘方形式们妥,返回以 e(自然對數(shù)的底數(shù)猜扮,近似等于2.7182)為底數(shù)的指數(shù)運(yùn)算的值。
log
這個函數(shù)返回以 e 為底的對數(shù)值(我們學(xué)數(shù)學(xué)時也寫成 ln)监婶。
log10
這個函數(shù)返回以 10 為底的對數(shù)值旅赢。
6. 總結(jié)
電腦只知道計(jì)算。
電腦會的運(yùn)算類型很基本:加惑惶、減煮盼、乘、除带污、取模(取模就是做除法后剩下的部分)孕似。
自加是將變量加一的運(yùn)算,寫成 variable++ 刮刑。
自減是將變量減一的運(yùn)算喉祭,寫成 variable-- 。
為了增加電腦能知道的運(yùn)算形式雷绢,需要載入數(shù)學(xué)庫(
#include <math.h>
)泛烙。數(shù)學(xué)庫里有更高級的函數(shù),例如 乘方翘紊,平方根蔽氨,舍入,指數(shù),對數(shù)鹉究,等宇立。
7. 第一部分第八課預(yù)告
今天的課就到這里,一起加油吧自赔!
下一課:C語言探索之旅 | 第一部分第八課:條件表達(dá)式
我是 謝恩銘妈嘹,公眾號「程序員聯(lián)盟」(微信號:coderhub)運(yùn)營者,慕課網(wǎng)精英講師 Oscar 老師绍妨,終生學(xué)習(xí)者润脸。
熱愛生活,喜歡游泳他去,略懂烹飪毙驯。
人生格言:「向著標(biāo)桿直跑」