2011年12月14日 星期三

C 語言入門 - 變數的運算與賦值

進一步了解變數

  之前說過變數是能為我們儲存資料的容器。既然能為我們儲存資料,自然不只用在存放使用者的輸入,我們也能請它們存放特定的資料,這個動作我們稱之為「賦值」 (assign) 並且使用了一個相當容易導致誤會的符號,也就是等號「=」。

int a, b;
a = 3;
b = 5;

  好了,請不要說出什麼 a 等於 3 或 b 等於 5 之類的話,就像把女大學生叫成阿姨一樣,是相當傷人的。請入境隨俗,在 C 語言的世界裡面,「=」和「等於」是完全無關的兩件事情。「=」就是「賦值」的符號,所以請說「對於變數 a,我們賦予 3 這個值」或是「我們使變數 b 的值變成 5」或是「變數 a,能請你為我儲存 3 這個值嗎?」甚至是「變數 b,聽好了,從現在起你的值就是 5 了」。絕對絕對和「等於」沒有任何的關係,絕對。它們不會希望被誤解的。你也不會希望身為一個程式高手,而你迅速地敲著鍵盤寫出一份非常藝術堪稱完美的程式碼時,卻被當作在做化學實驗。

  現在我們可以任意地賦予一個變數特定的數值了。人總是喜歡得寸進尺,做到了這一步就想更進一步。我們希望不只是一個特定的值,怎麼辦?比如說,使用者輸入了一個數,我就是喜歡改成他輸入的數減一。這不難,因為我們懂得賦值。假設使用者輸入了 a,那麼它的減一是多少?a-1 嘛,這猴子都知道。所以事情圓滿解決了。

int a, b;
scanf("%d", &a);
b = a-1;

  相當完美。首先我們宣告變數,用作儲存使用者的輸入,然後在有了適當容器後著手讀取。之後將它減一的值賦予變數 b,一切看起來相當完美。簡直就是最佳結局了。

  賦值的規則是,它的左邊必須要是被賦值的變數,而不可以是別的東西。它的右邊必須是一個運算式 (Expression, 或稱表達式) ,在程式執行時會先將右邊的結果計算出來,然後將這個值賦予左邊的變數。以下是一些錯誤的示範。

3 = a;

  賦值符號的左右兩邊在意義上是不相等的。左邊是目標容器,右邊是要儲存的資料。這樣寫的話是將 a 的值賦予給 3,但是 3 是個整數而不是容器。你可以想像你是把水壺往水裡扔,而不是把水往水壺裡倒。也就是說我們搞錯目標物和目的地了。這樣是不行的。

a,b = 3;

  在規定上目標只能有一個。同時有多個變數想賦予同一個值的時候,請別想著偷懶,老實地一件件事分開做。在寫程式時需要的是將問題簡化後,拆成許多小步驟,而不是反過來將許多小步驟湊在一起處理。

a+b = 5;

  這已經不知所謂了。在做加法運算時會將 a 和 b 所儲存的資料拿出來,然後相加。相加之後只會是一個值,而不是一個變數,所以也是錯誤的。


讓變數的值增加或是減少

  你可能會想,如果我要增減一個變數現存的值,怎麼辦?照剛剛的邏輯,若要讓變數 a 的值多一,新的值顯然是 a+1,要賦予新值的目標是 a,於是我們得到的結論是:

a = a+1;

  如果你覺得看到這行都要崩潰了,天啊!a 怎麼可能等於 a+1,這程式跑下去一定會爆炸!那麼我們可愛的等號可能會哭給你看,或者已經在哭了。都說了多少次這不是等於,這是賦值。沒錯,這是正確的寫法。你可以不必寫成這樣

b = a;
a = b+1;

  即使照數學來講這也是必錯的,但是以賦值的角度來看這是正確的。如果你還沒習慣,沒關係慢慢來,賦值還是會長伴你左右不會離你而去,只是抱持著這樣的誤會,將會相當程度影響你的思考。最好試著早些調整思考方式,以程式語言的角度去思考、去看這個程式的世界。

  除此之外,由於讓變數加減一,實在太常用了。因此 C 語言特地準備了專為加減一量身打造的符號,比起一般的先加減再賦值,運算速度會快上許多。以下示範兩種讓 a 的值加一的方法。

a++;
++a;

  理所當然地如果是要減一,會寫成

a--;
--a;

  單純用來對變數做增減的話,兩種寫法的結果是相同的。++a 和 --a 會比 a++ 及 a-- 來得快速,不過只用在增減時,優秀的編譯器通常會將它們優化至差不多的效能,所以挑順手的方式寫就可以了。它們在並非單純用於增減時會有微妙的差異,這在以後關於運算子與運算元的文章中會提及。

  現在你可以試著寫個程式,輸入一個整數,然後輸出該整數的平方。或是輸入兩個整數,試著輸出這兩個整數的和。

沒有留言:

張貼留言