CPU 用來暫存資料的變數
什麼叫做變數 (variable)
-
請參考並預習課本 page ???
-
程式裡的變數是電腦中的 CPU 存放一些數值或是資料的地方,
就好像你的腦袋,
他知道怎麼樣做加減乘除等運算,
可是如果給你 100 個數字要你加起來,
一般人會把這些數字用紙筆 "記下來" ,
然後一個數字接著一個加起來,
運算的中間結果也是記錄在紙上,
CPU 當然不是用紙筆,
它就是用變數記錄這 100 個數字。
原則上,一個變數裡可以放一個數字或是資料,
另外就像你寫在紙上的資料可以塗掉重寫一樣,
變數裡的資料也可以塗掉換成另一個資料,
而原來的資料就看不到了,
變數內的資料會被 CPU 改變這一點就是為什麼它叫做 "變數" 的原因了。
程式裡的變數和代數裡的變數有關係嗎?
數學裡的變數不是用在函式裡就是用在方程式裡:
f(x) = 3.5 x3 - 4 x2 + 5.2
x2 + 2 x + 1 = 0
用在函式時有所謂的自變數和因變數,
自變數有它的定義域,
也就是說自變數是一大堆數字中的一個;
用在方程式裡則是指某一些特定的數值,
基本上和程式裡的變數是無關的。
變數都有一個名稱:
為什麼變數要有名稱?
如果你在一張紙上記錄 100 個數字,
下個星期再回來看的話,
你知道哪一個數字代表什麼意義嗎?
所以通常你還會替每一個數字加上簡單的說明,
或是給他一個名稱,
在程式裡面的話也是一樣的,
程式設計者替每一個存放資料的變數取一個名字,
這樣 CPU 能根據變數的名字來使用它所記錄著的資料。
例如:
有一個程式 AddNumber.exe
它由鍵盤讀取 10 個整數資料,
把它們加起來再把結果列印出來,
請執行一下....
請你想一想,
這樣子的程式是不是會命令 CPU 做下面的一連串工作呢?
-
將一個累計的變數設為 0
-
重複下列兩個步驟 10 次
-
由鍵盤讀取一個數字記錄起來
-
把這個數字加到一個累計的變數裡
-
列印累計變數內存放的數值資料
在 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 程式吧!
-
寫一個 main() 函式的空殼子
-
重複做十次某些動作的話該用
for (count=0; count<0; count++)
{
.....
}
-
宣告一個變數內存放的是整數資料的話要用
待會兒還有其它的變數......
-
由鍵盤讀取一個整數該用
scanf("%d", &inputNumber);
記得變數要先宣告其型態,
還應該在最前面加上
來定義一下 scanf() 函式。
-
"加到累計的變數裡"這句話應該先解釋為
"把變數裡的資料和新數字相加起來再存放到原變數中"
所以該用
記得再定義一個整數變數 sum。
-
把所有 10 個數字都加到 sum
裡看起來應該可以得到正確的結果,
可是在第一次執行
時會先讀出 sum 變數內的資料,這裡頭是什麼啊?
(事實上什麼都有可能耶!)
所以我們應該用下面的敘述先放個 0 進去,
-
列印結果該用
printf("The sum of ten digits is %d\n",sum);
前面已經加過 #include <stdio.h>了,所以這裡不用重複了。
-
哇!結束了,測試一下吧!
變數宣告的時機
一個變數在適當的時候宣告,
可以免除很多程式設計者的負擔,
有的人喜歡把所有程式使用到的變數都在程式一開始的時候宣告,
以避免不小心忘記宣告,
可是這樣子做的話所有的變數在程式裡都隨時保持可以更改的狀況,
萬一你程式出錯了,
你希望找出究竟某一個變數在什麼地方值出錯了,
那可就要整個程式都搜索一遍了。
因此如果保持需要用的時候再宣告的話,
可以得到較為清楚的程式。