CPU 用來暫存資料的變數

什麼叫做變數 (variable)

  1. 請參考並預習課本 page 55-59,68,88,165-189

  2. 程式裡的變數是電腦中的 CPU 存放一些數值或是資料的地方, 就好像你的腦袋, 他知道怎麼樣做加減乘除等運算, 可是如果給你 100 個數字要你加起來, 一般人會把這些數字用紙筆 "記下來" , 然後一個數字接著一個加起來, 運算的中間結果也是記錄在紙上, CPU 當然不是用紙筆, 它就是用變數記錄這 100 個數字。 原則上,一個變數裡可以放一個數字或是資料, 另外就像你寫在紙上的資料可以塗掉重寫一樣, 變數裡的資料也可以塗掉換成另一個資料, 而原來的資料就看不到了, 變數內的資料會被 CPU 改變這一點就是為什麼它叫做 "變數" 的原因了。

程式裡的變數和代數裡的變數有關係嗎?

數學裡的變數不是用在函式裡就是用在方程式裡: 用在函式時有所謂的自變數和因變數, 自變數有它的定義域, 也就是說自變數是一大堆數字中的一個; 用在方程式裡則是指某一些特定的數值, 基本上和程式裡的變數是無關的。

變數都有一個名稱:

為什麼變數要有名稱?

如果你在一張紙上記錄 100 個數字, 下個星期再回來看的話, 你知道哪一個數字代表什麼意義嗎? 所以通常你還會替每一個數字加上簡單的說明, 或是給他一個名稱, 在程式裡面的話也是一樣的, 程式設計者替每一個存放資料的變數取一個名字, 這樣 CPU 能根據變數的名字來使用它所記錄著的資料。 例如: 有一個程式 AddNumber.exe 它由鍵盤讀取 10 個整數資料, 把它們加起來再把結果列印出來, 請執行一下....

請你想一想, 這樣子的程式是不是會命令 CPU 做下面的一連串工作呢?

  1. 將一個累計的變數設為 0

  2. 重複下列兩個步驟 10 次
    1. 由鍵盤讀取一個數字記錄起來
    2. 把這個數字加到一個累計的變數裡

  3. 列印累計變數內存放的數值資料

在 1 中"累計的變數"就是本程式需要的一個變數, 2.a 中所謂 "記錄起來" 是本程式需要的第二個變數, 要重複 10 次的話又需要另一個變數來記錄目前 CPU 到底在做第幾次了, 這三個變數我會依序給它取名叫做 sum, inputNumber, count 。 你在取名字的時候一定要取一個能代表它所存放資料意義的名字, 千萬別偷懶叫它們是 a,b,c 或是 x,y,z。

如何使用變數呢?

假設有一個變數 x, C 程式的敘述

的意思就是在 x 這個變數裡記住 (存放) 10 這個數字。

的意思就是叫 CPU 看一下 x 這個變數現在記錄的數值是多少, 把這個數值加 1, 把這個結果再放進變數 x 裡面 (原來的資料會被蓋掉)。

如果你用代數的觀念來想 x = x + 1 這個敘述的話, 如果你覺得這個敘述是對的話, 你的數學老師都該要退休了。 以代數的眼光來看, 這個敘述當然是不對的。 還好,這不是代數。 請你回憶一下學習程式語言的方法, 你就別問 "為什麼這裡用的符號 'x' 、 '=' 、 '+' 都和代數裡頭一樣可是意義卻不一樣了?" 沒有什麼特殊原因, 因為在 C 語言中 x = x + 1 就是解釋為 "把 x 變數的內容拿出來加 1 以後再存回變數 x 之中"。

倒是可以告訴你有一種叫做 APL 的語言, 為了降低上述誤會的可能性, 把上面的動作以

表示, 應該有比較清楚吧!

在 PASCAL 中也是因為這樣, 所以用

來表示上面的動作。

好, 最後希望你看到 x = x + 1 的時候把它念成 "把變數 x 的內容拿出來加 1 以後再存回變數 x 中" 這樣你就會很清楚如何在 C 程式中使用 x = x + 1 這樣的敘述了。

變數的型態

變數都要在使用前先定義它所要存放資料的型態, 例如:int sum; 定義 sum 這個變數裡存放的資料是整數型態。 變數除了如前說都要有一個名稱之外, 還要先說清楚它裡面要放什麼樣子的資料。 你可以這麼想: 當你看到在紙上寫的 disque 或是 manuel 時, 你可能會想說這個英文是什麼意思啊? 可是你要是真的去查英文字典的話你大概會失望的, 應該是查不到的, 因為這是法文嘛! 你看,不跟你說的話你大概以為我拼錯了吧! 另外舉一個例子,如果你看到 1010 的話, 到底是十進位的壹千零壹拾呢, 還是二進位裡代表拾的數字呢? 在程式裡也是這樣子的, 如果你只說 number 是一個變數, 可以用來存放資料而不說資料是什麼樣格式的, 那麼程式裡在使用這資料的時候就會出現模稜兩可的狀況、 CPU 不知道你到底要做什麼,例如:

int x;
x + 1;
float x;
x + 1;

兩個情形下 CPU 在執行到 x+1 時加法動作是完全不一樣的。

C 程式裡有哪些型態可以用呢?

來撰寫上面的 AddNumber.c 程式吧!

  1. 寫一個 main() 函式的空殼子

  2. 重複做十次某些動作的話該用
      for (count=0; count<0; count++)
      {
      .....
      }

  3. 宣告一個變數內存放的是整數資料的話要用
      int count;
    待會兒還有其它的變數......

  4. 由鍵盤讀取一個整數該用
      scanf("%d", &inputNumber);
    記得變數要先宣告其型態, 還應該在最前面加上
      #include <stdio.h>
    來定義一下 scanf() 函式。

  5. "加到累計的變數裡"這句話應該先解釋為 "把變數裡的資料和新數字相加起來再存放到原變數中" 所以該用
      sum = sum + inputNumber;
    記得再定義一個整數變數 sum。

  6. 把所有 10 個數字都加到 sum 裡看起來應該可以得到正確的結果, 可是在第一次執行
      sum = sum + inputNumber;
    時會先讀出 sum 變數內的資料,這裡頭是什麼啊? (事實上什麼都有可能耶!) 所以我們應該用下面的敘述先放個 0 進去,
      sum = 0;

  7. 列印結果該用
      printf("The sum of ten digits is %d\n",sum);
    前面已經加過 #include <stdio.h>了,所以這裡不用重複了。

  8. 哇!結束了,測試一下吧!

變數宣告的時機

一個變數在適當的時候宣告, 可以免除很多程式設計者的負擔, 有的人喜歡把所有程式使用到的變數都在程式一開始的時候宣告, 以避免不小心忘記宣告, 可是這樣子做的話所有的變數在程式裡都隨時保持可以更改的狀況, 萬一你程式出錯了, 你希望找出究竟某一個變數在什麼地方值出錯了, 那可就要整個程式都搜索一遍了。 因此如果保持
需要用的時候再宣告的話, 可以得到較為清楚的程式。

變數的初始化

程式設計課程 首頁
by Pei-yih Ting
E-mail: pyting@cs.ntou.edu.tw