2011年9月9日 星期五

想學程式?可以先從該語言的「定數(Literals)」學起!

Technorati 的標籤:,,

image 
個人因為擔任電腦講師之故,最近正在教授 iPhone 程式設計的專用電腦語言 – Objective-C。目前經手的這一班,五人中有四人完全沒有程式設計經驗。所以常被同學問道:「我完全沒寫過程式,買了市面上的書,看不太懂。要如何開始?」每次被問到這個問題,我都會神秘地笑一笑:「從參加紀老師的課程開始…。」




哈哈哈!認真一點講的話,我會建議從學一個電腦語言的「定數(Literals)」開始。什麼是「定數」?事實上就是數學上講的「常數(Constants)」。如:3.1416、128…這類數字或資料。不乾脆叫它「常數」的原因,是因為電腦語言中的「常數」另有其人。所以原來叫「常數」的東西,只好另外取個名字叫做「定數」囉!

教了 20 年的程式設計,覺得「定數」在課程大綱的重要性,遠遠被低估。市面上很少有講師或書籍,把「定數」這個東西獨立成一章,放在最前頭講的。自從我把「定數」變成課綱中的斥候兵後,很多原本完全不會寫程式的人,都很興奮地告訴我,我幫他們找到一塊程式設計最棒的敲門磚。讓他們現在有能力昂首挺胸地坐在桌前,寫出一支支漂亮的程式。這部份算是我個人教學中的小小特色。

言歸正傳,我這篇是要幫大家整理 Objective-C 中的定數的。本篇並非教學文,應該比較像是學會定數以後,我幫大家做的一篇整理文。如果您想看到比較完整的「定數」教學,我可以把整份「定數」講義提供給大家,請直接點選下列連結:

那麼,就廢話不多說了…請服用~

Objective-C 定數種類


image

一共有四大類,都可以直接用在程式碼中:
  1. 整數定數(Integer Literals)
    • 依照進制來分:123(十進位)、0123(八進位)、0x123(十六進位)
    • 依照大小來分:123(一般整數,4 bytes)、123L(長整數,8 bytes)、123LL(超長整數,8 bytes)
    • 依照號數有無來分:123(有號數)、123u(無號數)
  2. 浮點數定數(Floating Point Literals)
    • 依照大小來分:1.23F(單精確度,4 bytes)、1.23(雙精確度,8 bytes)、1.23L(超長雙精確度,16 bytes)
    • 依照表示法來分:1.23(一般表示法)、1.23e-10(科學記號表示法,相當於 1.23 x 10-10
  3. 文字定數(Text Literals)
    • 字元定數(Character Literals)
      • 依照大小來分:'a’(單字元組,至少 1 byte,Mac 給 4 bytes)、L‘a’(雙字元組,至少 2 bytes,Mac 給 4 bytes)
      • 依照表示法來分:'a’(一般表示法)、'\141’ASCII 表示法)
      • 特殊字元:'\n’(換列)、'\t’(Tab)、'\f’(換頁)、'\b’(倒退鍵)…
    • 字串定數(String Literals)
      • Unicode 字元定數(Objective-C 以字串對待之):"\u4e59”(Unicode 0x4E59,等於「乙」字,Objective-C 中,所有中文字都會被當成 Unicode,也就是以字串對待之)
      • 一般字串定數:"Hello”(承襲自 C 語言,SZ 格式)
      • Objective-C 字串定數: @"Hello”(Objective-C 自創,事實上是個 NSString 物件)
  4. 布林值定數(Boolean Literals)
    • TRUEFALSE:承襲自 C 語言的布林值定數,以 4 bytes(int)儲存表示之。
    • truefalse:承襲自 C++ 語言的布林值定數,以 4 bytes(int)儲存表示之。
    • YESNO:Objective-C 自創的布林值定數,以 1 bytes(unsigned char)儲存表示之。
若您是程式語言的老手,看到這裡,應該就足夠完全掌握 Objective-C 的定數了。

Objective-C 定數總整理

接下來,我把四大類的 Objective-C 定數的寫法,搭配上它所需的 printf() 格式指定字(Specifiers),佔用多少記憶體,底層使用哪種編碼法編成 0 與 1,統統作成表格。希望這樣能夠對剛剛踏入 Objective-C 程式設計的朋友,有提綱挈領的作用。

整數定數部份

image

浮點數定數部份

image

文字定數部份

image

布林值定數部份

image

小結

為何「定數」的學習是程式設計最佳敲門磚呢?很多講師教程式設計,第一課都從「變數(Variables)」教起。但變數的 x, y, z 比定數 1, 2, 3 抽象多了,學完常常澆熄許多滿懷壯志的未來程式師。殊不知我們學數學的時候,也是小學學 123(定數),國中才學 xyz(變數)啊!那為何電腦程式設計不這麼教呢?

所以,下次您學習任何一種電腦語言時,別忘了先學該語言的定數有哪些?該怎麼表示?要怎麼印出來?弄清楚這些後,再去碰變數,相信您在學習程式設計的路上,一定會更順遂的。

若想隨時得知與程式設計有關的訊息,歡迎加入「紀老師電腦教學網」粉絲團: http://www.facebook.com/teacherchi

12 則留言:

  1. 台灣好像比較少將Literals翻譯成定數,似乎比較多人稱它為"字面常數"或"字面值"。

    回覆刪除
  2. 非常謝謝您的提醒。事實上,我最早就是用「字面常數」這個翻譯,後來參考大陸那邊的翻譯改成「定字」。但是,在電腦補習班實際教學時,發覺「定數」這樣的翻譯,學員們比較能夠了解。在教學中,我是把「定數(Literals)」、「變數(Variables)」、「常數(Constants)」一起教。尾巴都有個「數」,學員們也比較了解三者之間的關聯性。「定數」可能算不上能登大雅之堂、或是絕對權威的翻譯。不過對我來說,卻是教學效果最好的一個翻譯。所以,就暫時採用這個譯名。或許將來遇到更傳神的,我又會改也說不定。課堂中我也一再強調,我大部分的時間會用英文「Literals」,而非「定數」。「定數」只是給剛入門、或對英文有恐懼症的學員,當作一個敲門磚而已。所以,這麼翻譯真的是非常個人的習慣。

    回覆刪除
  3. 老師好,
    1,apple系統和安卓系統的app製作是否要學不同的程式語言?會建議從哪一個入手呢?
    2,我不打算製作app賺錢,但是想要做出來後可以在不同裝置上使用
    3,想學做app需要從網頁程式設計開始入門嗎?

    回覆刪除
    回覆
    1. 您好:

      1. Android 使用 Java,iOS 使用 Swift 或 Objective-C,的確使用不同語言。至於從哪個入手都可以,就像自由式與蛙式沒有誰得先學的道理一樣,完全取決於個人興趣與決定。

      2. 如果想在不同裝置上使用,把您的軟體做成網頁最快了!因為不管任何平台,都一定能開啟網頁。但是,網頁有執行效能的問題。如果您的軟體需要大量運算(如:遊戲),可能可以考慮用不同語言都做一遍,好讓它跑在不同平台的作法。若您的東西是如行事曆、計算機...等簡單服務的話,用網頁做一遍、讓它能跑在各大平台這樣是完全沒問題的。

      3. 做 App 不一定要從網頁入門。以上面做過的說明為例,Android App 可以用 Java 寫,效能比較好,但學會 Java 可能比較困難。也可以用網頁寫,效能比較差,但是網頁設計的技巧,可能比精通 Java 要簡單一些。

      希望以上的回答對您有幫助。

      刪除
  4. 「定數」此名譯得妙,本人大力支持。至於「字面常數」或「字面值」是生吞活剝的硬譯,不妥。

    回覆刪除
    回覆
    1. 非常感謝您的讚賞!距離寫這篇文章已經過去 10 年了,居然還有人來這邊留言,真的非常開心。我現在教書還是用「定數」這個翻譯,來取代英文 Literals 。同學們的接受度仍然非常高。所以我想我還是會繼續用下去。

      刪除
    2. 方便請問紀老師現在主要教授哪些科目和程式語言嗎?有沒教git和docker?

      刪除
    3. 目前在台灣科大教 C++、台灣大學電算中心教 Python、機器學習、Git(推廣部課程)、中央研究院分子生物所教「生物資訊」。大概是這樣。

      Git 與 Docker 要自學的話,會推薦這幾本書:
      Git: https://bit.ly/3w5d1gv
      Docker: https://bit.ly/3mAgNLJ

      希望有幫助。

      刪除
  5. 老師您好,我是程式初學者,最近在看 JS,有些疑惑,不知道能否向老師請教?

    最早學 JS 的時候,大家都說宣告變數的寫法是:
    var a = 5
    a 是變數,而等號後面的就是值,是被拿去 assign 進變數裡。

    最近在看 W3shool 的文章時,其說:
    JavaScript Values:
    The JavaScript syntax defines two types of values:

    Fixed values
    Variable values
    Fixed values are called Literals.
    Variable values are called Variables.

    最後一句英文讓我有點困惑,因為他說可以變動的值就叫做變數。請問變數也算是一種值嗎?
    以先前的例子來說的話,var a = 5;
    那 a 和 5 都是一種值嗎?
    因為之前學到的是「值是被拿去 assign 進變數的」,也就是說變數是一個拿來存放值的容器,所以從來沒有想過變數是不是也是一種值。
    謝謝老師

    回覆刪除
    回覆
    1. 您好:

      常數(Fixed Values)與變數(Variable Values)這兩個概念,對程式設計來說,的確都是「值」。所謂「值」,就是一塊記憶體,裡面存放整數、小數、文字...等內容物的就算。

      兩者的差別,只是如 3 這樣的常數(程式裡面稱為定數 Literals),程式不允許你變更「同一塊記憶體裡面的值」。如果你想使用另一個常數 5,系統會另外霸佔一塊記憶體存放 5,而非修改原來存放 3 那塊記憶體、重複利用之。

      而裡面存放 3、名字為 x 這樣的變數,若你想將值改成 5,程式允許你變更同一塊記憶體,使之仍然叫做 x,但其內的數值已經變成 5。

      所以,只要是能夠存取的一塊記憶體,就是「值」。不論它是常數(Literals),還是變數(Variables)。

      希望這樣有回答到您的問題。

      刪除
    2. 謝謝老師,您的說明很清楚,我有懂了!

      刪除