C語言探索之旅 | 第一部分第七課:運算那點事

做者 謝恩銘,公衆號「程序員聯盟」。 轉載請註明出處。 原文:www.jianshu.com/p/7bc4493eb…git

《C語言探索之旅》全系列程序員

內容簡介


  1. 前言
  2. 基礎運算
  3. 變量之間的運算
  4. 縮寫
  5. 數學庫
  6. 總結
  7. 第一部分第八課預告

1. 前言


上一課是 C語言探索之旅 | 第一部分第六課:變量的世界(三),顯示變量內容github

今天,咱們一塊兒來學習 C語言(對大多數編程語言也相似)中的運算。編程

以前的課中,咱們已經說過:電腦是一臺「笨笨」的機器,只會作計算。bash

無論你是用電腦來聽音樂,仍是用電腦來看電影,玩遊戲,其實電腦只是在作運算。否則怎麼叫「計算機」呢?編程語言

這一課咱們一塊兒來學習電腦能實現的大多數運算。咱們會繼續使用上一課學到的變量的知識。其實,就是對變量作加,減,乘,除,取模,等等各類操做。函數

即便你對數學不感興趣,這一課也是必不可少的。硬着頭皮上吧~學習

2. 基礎運算


說到基礎運算,無外乎: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。

好了,我宣佈一個好消息:「咱們已經學了全部的基礎運算了。數學課下課了~」

3. 變量之間的運算


誒,變量之間的運算?

怎麼數學老師剛走,又來了數學教授啊?沒辦法,電腦又名計算機,確定要跟數學打點交道的嘛。幸好來的不是「叫獸」。

既然咱們在上面一節中已經學習了基礎的 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
複製代碼

可能你還沒意識到:這是咱們第一個有點意思的程序。咱們的程序請求用戶輸入兩個數,而後作加法,再把結果輸出到屏幕上。很棒吧!

請你本身也試着用其餘四個基礎運算符來寫程序,看看結果如何。

4. 縮寫


以前咱們保證過,不會再有新的運算形式出現了。確實如此,咱們已經知道了全部的基礎運算:加、減、乘、除、取模。用這些基礎運算咱們能夠作全部事情。不須要其餘的運算了。

我知道這很難使人相信。你會說難道一個很複雜的 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)
複製代碼

5. 數學庫


在 C語言中,咱們有一些稱之爲「標準庫」的東西,就是那些很實用的庫。咱們通常會常用那些基礎庫。

複習一下:庫就是指已經定義好的函數和變量的集合。這些函數由前人寫成,能夠避免咱們重複「造輪子」。

咱們已經使用過 stdio.h 庫中的 printf 和 scanf 這兩個函數了。

其實還有不少其餘很實用的庫,其中就有一個叫 math.h,裏面包含了與數學相關的函數。

實際上,光是加、減、乘、除、取模是不夠的。雖然底層都是這五個運算,可是不少時候咱們須要作複雜的運算形式,就須要調用庫或者本身寫函數了。

由於電腦並沒辦法理解除了 +,-,*,/,% 以外的運算符,好比你若是要電腦作乘方,輸入 5 ^ 2,電腦徹底不理解什麼意思,除非你調用數學庫裏已經定義好的作乘方的函數。

調用數學庫很簡單,

#include <math.h>
複製代碼

只要用這一行代碼,接下來你的程序就能夠用裏面定義的全部函數了。

咱們介紹其中幾個最經常使用的吧。

fabs


這個函數返回絕對值:

  • 若是你傳給這個函數 -53,它會返回 53 。
  • 若是你傳給這個函數 53,它會返回 53 。
double absolute = 0, number = -29;
absolute = fabs(number);   // absolute 的值變爲 29
複製代碼

ceil


這個函數返回給出的浮點數後面緊接的整數。這是一種舍入的方式。ceil 函數老是舍入緊鄰的比參數大的整數。

double above = 0, number = 34.81;
above = ceil(number);  // above 的值變爲 35
複製代碼

floor


這個函數與 ceil 的做用相對,返回給出的浮點數前面緊接的整數。

double below = 0, number = 45.63;
below = floor(number);   // below 的值變爲 45
複製代碼

pow


這個函數計算數字的乘方。你要給它兩個參數:底數和指數。

double result = 0, number = 2;
result = pow(number, 4);  // result 的值變爲 16(2 ^ 4 = 16)
複製代碼

sqrt


這個函數返回參數的平方根。返回值是 double 類型。

double result = 0, number = 100;
result = sqrt(number);  // result 的值變爲 10
複製代碼

sin, cos, tan


這三個函數是計算正弦,餘弦,正切的值。

asin, acos, atan


這三個函數是計算反正弦,反餘弦,反正切的值。

exp


這個函數是特殊的乘方形式,返回以 e(天然對數的底數,近似等於2.7182)爲底數的指數運算的值。

log


這個函數返回以 e 爲底的對數值(咱們學數學時也寫成 ln)。

log10


這個函數返回以 10 爲底的對數值。

6. 總結


  1. 電腦只知道計算。

  2. 電腦會的運算類型很基本:加、減、乘、除、取模(取模就是作除法後剩下的部分)。

  3. 自加是將變量加一的運算,寫成 variable++ 。

  4. 自減是將變量減一的運算,寫成 variable-- 。

  5. 爲了增長電腦能知道的運算形式,須要載入數學庫(#include <math.h>)。

  6. 數學庫裏有更高級的函數,例如 乘方,平方根,舍入,指數,對數,等。

7. 第一部分第八課預告


今天的課就到這裏,一塊兒加油吧!

下一課:C語言探索之旅 | 第一部分第八課:條件表達式


我是 謝恩銘,公衆號「程序員聯盟」運營者,慕課網精英講師 Oscar 老師,終生學習者。 熱愛生活,喜歡游泳,略懂烹飪。 人生格言:「向着標杆直跑」

相關文章
相關標籤/搜索