做者 謝恩銘,公衆號「程序員聯盟」。 轉載請註明出處。 原文:www.jianshu.com/p/7bc4493eb…git
《C語言探索之旅》全系列程序員
上一課是 C語言探索之旅 | 第一部分第六課:變量的世界(三),顯示變量內容 。github
今天,咱們一塊兒來學習 C語言(對大多數編程語言也相似)中的運算。編程
以前的課中,咱們已經說過:電腦是一臺「笨笨」的機器,只會作計算。bash
無論你是用電腦來聽音樂,仍是用電腦來看電影,玩遊戲,其實電腦只是在作運算。否則怎麼叫「計算機」呢?編程語言
這一課咱們一塊兒來學習電腦能實現的大多數運算。咱們會繼續使用上一課學到的變量的知識。其實,就是對變量作加,減,乘,除,取模,等等各類操做。函數
即便你對數學不感興趣,這一課也是必不可少的。硬着頭皮上吧~學習
說到基礎運算,無外乎:ui
其實你的電腦也只知道作這些基礎運算,若是你要它作更復雜的運算(平方,乘方,對數,等),那你須要編程才行,就是說你須要向電腦解釋怎麼作。spa
可是,很幸運的是,在這一課中咱們會看到其實 C語言已經設計好了數學庫(關於庫的知識,請看之前的課程。簡單地說就是已經編寫好的,能夠供你的程序調用的各類變量和函數的集合),你只要用專家定義好的庫裏面的內容就行了,不須要本身重複「造輪子」。
一開始,咱們從加法開始看吧。
爲了在 C語言中作加法,咱們要用到 + 號。不開玩笑,就是這麼簡單。
你要把加法的結果放到一個變量裏面。咱們就來建立一個整數類型的變量,取名叫 result(表示「結果」)。
int result = 0;
result = 4 + 6;
複製代碼
沒必要是專業數學家,也能夠猜測到程序運行後 result 的值會變爲 10,咱們用 printf 函數來輸出結果:
printf("4 + 6 = %d", result);
複製代碼
運行程序,顯示:
4 + 6 = 10
複製代碼
看吧,加法就是這麼簡單,一點也不任性。
對於其餘的運算類型,也是一樣的原理。只有運算符不一樣,見下表:
運算 | 符號 |
---|---|
加法 | + |
減法 | - |
乘法 | * |
除法 | / |
取模 | % |
若是你曾經使用過電腦上的計算器,你確定知道這些符號。除了最後兩個(除和取模),其餘應該很熟悉。咱們就來講說最後兩個符號。
當沒有餘數時,除法運行得好好的。好比,6 / 3 等於 2,你的電腦給了你正確的答案。到這裏爲止尚未問題。
可是,咱們假如讓電腦作 5 / 2,按理結果應該是 2.5。可是,來看看咱們的程序:
int result = 0;
result = 5 / 2;
printf ("5 / 2 = %d", result);
複製代碼
運行程序,顯示:
5 / 2 = 2
複製代碼
咱們讓電腦計算 5 / 2,期待的結果是 2.5,可是實際上電腦卻給出了 2。這不是「很二」嘛... 親愛的電腦,你怎麼能夠這樣對我?
其實,內有蹊蹺。難道咱們的電腦真的在這點上這麼蠢笨嗎?
事實上,當電腦看到數字 5 和 2 時,它會作一個整數之間的除法(也叫作「歐幾里得除法」),就是說它會把結果截取一段,只留下整數部分(這裏是 2)。
你也許會說:「啊,我知道了,都是由於 result 這個變量是整數類型嘛。若是把 result 聲明爲 double 類型的浮點數,那它應該能夠儲存帶小數點的數啦。」
其實否則,這不是緣由。假如你把 result 聲明爲 double 類型,運算 result = 5 / 2,你仍是會獲得 2。事實上,這是由於 /
運算符兩邊的數是整數,因此電腦會作整數之間的除法。
固然,也是可讓電腦輸出你想要的結果的,怎麼辦呢?看下面程序:
double result = 0;
result = 5.0 / 2.0;
printf ("5 / 2 = %f", result);
複製代碼
運行,顯示:
5 / 2 = 2.500000
複製代碼
看到了嗎,若是要你的電腦顯示正確結果,還須要你把運算符兩邊的數寫成 5.0 和 2.0(一樣是 5 和 2,可是電腦卻認爲這兩個是浮點數,所以它就作浮點數的除法)。怎麼樣,電腦任性不?
這個整數除法的特性很重要。因此得記住,對於電腦來講:
5 / 2 = 2
10 / 3 = 3
4 / 5 = 0
複製代碼
有點使人吃驚,不是麼?但這就是電腦作整數運算的方式。
若是你想要獲得浮點數的結果,須要運算的數自己是浮點數(提一下,其實不須要兩個數都是浮點數,一個是浮點數就夠了,電腦會自動把另外一個也認爲是浮點數來作運算):
5.0 / 2.0 = 2.5
10 / 3.0 = 3.33333
4.0 / 5 = 0.8
複製代碼
事實上,在作整數除法時,好比 5 / 2,你的電腦會回答下面問題:「5裏面有多少個 2 ?」,答案是兩個。一樣的,「10 裏面有多少個 3 呢」,答案是三個。
而後你又會問了,咱們怎麼才能獲取到除法剩下的數(餘數)呢?
這就要輪到取模運算出場了。
取模運算是得到除法的餘數的一種數學運算。可能相比 加、減、乘、除這基本的四則運算來講,它沒有那麼被人熟知,但對電腦來講,取模是基本的運算之一。頗有多是爲了解決上面提到的整數除法的難題。
上面表格裏列出來了,取模的符號是 %
如下列出一些取模運算的例子:
5 % 2 = 1
14 % 3 = 2
4 % 2 = 0
複製代碼
取模運算 5 % 2 是除法運算 5 / 2 的餘數,因此是 1。電腦計算 5 = 2 * 2 + 1
,因此取模運算就得出 1 爲結果。
一樣地,14 = 3 * 4 + 2
,因此餘數爲 2。
4 = 2 * 2
,因此餘數爲 0。
好了,我宣佈一個好消息:「咱們已經學了全部的基礎運算了。數學課下課了~」
誒,變量之間的運算?
怎麼數學老師剛走,又來了數學教授啊?沒辦法,電腦又名計算機,確定要跟數學打點交道的嘛。幸好來的不是「叫獸」。
既然咱們在上面一節中已經學習了基礎的 5 種運算,那如今能夠來看看變量之間的運算咯。
事實上,變量之間的運算也是同理。
result = number1 + number2;
複製代碼
上面這一行代碼對 number1 和 number2 這兩個變量作加法運算,而且把結果儲存到 result 這個變量裏。
如今咱們的學習愈來愈有意思了。其實你如今已經能夠實現一個迷你的計算器的功能了,不要懷疑本身,你能夠的。
想象一個程序,請求用戶輸入兩個數,這兩個數,你將其儲存在變量裏。
而後,你對這兩個變量作加法,而且把結果儲存在另外一個變量裏。接下來,你就只須要把計算的結果顯示在屏幕上就行了,讓用戶看看電腦的本領,不少人作加法可沒有這麼快速呢!
試着本身編寫以上程序,很簡單的,也能夠給你練手。
固然了,咱們仍是把代碼寫上:
#include <stdio.h>
int main(int argc, char *argv[])
{
int result = 0, number1 = 0, number2 = 0;
// 請求用戶輸入number1和number2的值:
printf("請輸入數字1 : ");
scanf("%d", &number1);
printf("請輸入數字2 : ");
scanf("%d", &number2);
// 作運算:
result = number1 + number2;
// 把運算結果顯示在屏幕上 :
printf ("%d + %d = %d\n", number1, number2, result);
return 0;
}
複製代碼
運行,顯示:
請輸入數字1 : 289
請輸入數字2 : 376
289 + 376 = 665
複製代碼
可能你還沒意識到:這是咱們第一個有點意思的程序。咱們的程序請求用戶輸入兩個數,而後作加法,再把結果輸出到屏幕上。很棒吧!
請你本身也試着用其餘四個基礎運算符來寫程序,看看結果如何。
以前咱們保證過,不會再有新的運算形式出現了。確實如此,咱們已經知道了全部的基礎運算:加、減、乘、除、取模。用這些基礎運算咱們能夠作全部事情。不須要其餘的運算了。
我知道這很難使人相信。你會說難道一個很複雜的 3D 遊戲最終也是由加、減、乘、除等構成的?是的,確實如此。
雖然如此,可是在 C語言裏咱們還能夠進行運算的縮寫。
爲何要縮寫呢?由於不少時候咱們作的運算都是重複的。下面你就會看到縮寫的好處了。
你會發現你在編程中常常要對一個變量進行 +1 操做。
假設你的變量名字是 number,你知道怎麼對它進行 +1 操做嗎?是這樣作的:
number = number + 1;
複製代碼
上面的語句作了什麼呢?
首先咱們作運算 number + 1,而後咱們把運算結果儲存到變量 number (它本身)中。
所以,假如咱們的變量值是 4,運算後變成 5 了,假如它的值是 8,那會變成 9,依此類推。
這個運算是重複的。要知道,計算機科學家都是很懶的人,他們可不但願輸入兩遍 number(確實也挺累人的)。
因而他們發明了一個縮寫形式,叫作自增運算。它的結果和 +1 操做是同樣的:
number++;
複製代碼
這一行代碼,就是用了自增運算符 ++,是否是比剛纔那句 number = number + 1
簡單了?它意味着「對 number 作 +1 運算」。
敏銳的讀者可能想到了,編程語言 C++ 的 ++ 符號其實正是自增運算符的意思。我之前也不太理解爲何不是 C+,而是 C++。
原來計算機科學家跟你們開了一個頗有意味的玩笑:C++ 意味着對 C 作 +1 操做,表示「比 C語言多一點」。
固然了,事實上 C++ 只是用不一樣的方式來編程,並非說 C++ 比 C語言更優秀,只是不一樣而已。
知道了自加運算的原理,自減運算應該不難理解吧:就是對變量進行 -1 運算。
number--;
複製代碼
同理,其餘還有好幾種運算的縮寫形式。好比 number = number * 2;
能夠寫成 number *= 2;
。
看如下代碼:
int number = 2;
number += 4; // number 變爲 6
number -= 3; // number 變爲 3
number *= 5; // number 變爲 15
number /= 3; // number 變爲 5
number %= 3; // number 變爲 2(由於 5 = 1 * 3 + 2)
複製代碼
在 C語言中,咱們有一些稱之爲「標準庫」的東西,就是那些很實用的庫。咱們通常會常用那些基礎庫。
複習一下:庫就是指已經定義好的函數和變量的集合。這些函數由前人寫成,能夠避免咱們重複「造輪子」。
咱們已經使用過 stdio.h 庫中的 printf 和 scanf 這兩個函數了。
其實還有不少其餘很實用的庫,其中就有一個叫 math.h,裏面包含了與數學相關的函數。
實際上,光是加、減、乘、除、取模是不夠的。雖然底層都是這五個運算,可是不少時候咱們須要作複雜的運算形式,就須要調用庫或者本身寫函數了。
由於電腦並沒辦法理解除了 +,-,*,/,% 以外的運算符,好比你若是要電腦作乘方,輸入 5 ^ 2
,電腦徹底不理解什麼意思,除非你調用數學庫裏已經定義好的作乘方的函數。
調用數學庫很簡單,
#include <math.h>
複製代碼
只要用這一行代碼,接下來你的程序就能夠用裏面定義的全部函數了。
咱們介紹其中幾個最經常使用的吧。
這個函數返回絕對值:
double absolute = 0, number = -29;
absolute = fabs(number); // absolute 的值變爲 29
複製代碼
這個函數返回給出的浮點數後面緊接的整數。這是一種舍入的方式。ceil 函數老是舍入緊鄰的比參數大的整數。
double above = 0, number = 34.81;
above = ceil(number); // above 的值變爲 35
複製代碼
這個函數與 ceil 的做用相對,返回給出的浮點數前面緊接的整數。
double below = 0, number = 45.63;
below = floor(number); // below 的值變爲 45
複製代碼
這個函數計算數字的乘方。你要給它兩個參數:底數和指數。
double result = 0, number = 2;
result = pow(number, 4); // result 的值變爲 16(2 ^ 4 = 16)
複製代碼
這個函數返回參數的平方根。返回值是 double 類型。
double result = 0, number = 100;
result = sqrt(number); // result 的值變爲 10
複製代碼
這三個函數是計算正弦,餘弦,正切的值。
這三個函數是計算反正弦,反餘弦,反正切的值。
這個函數是特殊的乘方形式,返回以 e(天然對數的底數,近似等於2.7182)爲底數的指數運算的值。
這個函數返回以 e 爲底的對數值(咱們學數學時也寫成 ln)。
這個函數返回以 10 爲底的對數值。
電腦只知道計算。
電腦會的運算類型很基本:加、減、乘、除、取模(取模就是作除法後剩下的部分)。
自加是將變量加一的運算,寫成 variable++ 。
自減是將變量減一的運算,寫成 variable-- 。
爲了增長電腦能知道的運算形式,須要載入數學庫(#include <math.h>
)。
數學庫裏有更高級的函數,例如 乘方,平方根,舍入,指數,對數,等。
今天的課就到這裏,一塊兒加油吧!
我是 謝恩銘,公衆號「程序員聯盟」運營者,慕課網精英講師 Oscar 老師,終生學習者。 熱愛生活,喜歡游泳,略懂烹飪。 人生格言:「向着標杆直跑」