C 語言初學教材 - 第一章 常數與指派

簡單的例子的程式碼如下

#include <stdio.h>

int main(void)
{
    int month, day, hour, min;
    char *name;
    
    month = 7;
    day = 27;
    hour = 9;
    min = 45;
    name = "kaiching";
    
    printf("\n\n今天是 %d 月 %d 日\n", month, day);
    printf("現在是上午 %d:%d\n", hour, min);
    printf("哈囉, %s!\n\n", name);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:csimple.c
    功能:簡單顯示訊息的例子
    作者:張凱慶
    時間:西元2010年7月 */


我們把注意力放到函數 (function) 定義區中的變數 (variable)給值,下圖中程式碼的第 8 行到第 12 行



將數值 (value) 給變數,程式語言中稱為指派運算 (assignment operation) ,其為運算的一種,需要使用等號 = 當作運算子 (operator) ,因為這過程通常是將表示常數 (constant) 的數值放到變數所佔用的記憶體空間中。


C 語言可表示為常數的數值有四類,分別是字元 (character) 、字串 (string) 、整數 (integer) 及浮點數 (floating-point number) 。由於 C 語言直接支援 ASCII 編碼,所以字元型態的常數皆為表示 ASCII 編碼的符號,凡是用單引號 ' ' 圍住的單一符號皆為字元的常數。例如以下都是字元型態的常數
'a' // 小寫英文字母
'H' // 大寫英文字母
'%' // 百分比符號
' ' // 空格
'[' // 左中括弧
'=' // 等號


有一些不可見字元,例如換行、響鈴等稱為跳脫序列 (escape sequence) ,這是用反斜線加上某些字母組成的,如下為跳脫序列的完整列表
跳脫序列的字元功能
\a響鈴
\b倒退鍵
\f跳頁
\n印出新列
\r歸位符號
\ttab 鍵
\v垂直定位符號
\\印出反斜線
\?印出問號
\'印出單引號
\"印出雙引號


所謂的字串是指用雙引號 " " 圍住的連續字元,以下為字串常數的例子
"A bird in the hand is worth two in the bush."
"Fine words butter no parsnips."
"God helps those who help themselves."
"You cannot burn the candle at both ends."
"While there's life, there's hope."
"The early bird gets the worm."


簡單例子中的第 12 行
name = "kaiching";


由於已經在第 6 行宣告 name 為指向字元的指標 (pointer)
char *name;


因此 name 中會存放 "kaiching" 中第 1 個字元 'k' 的記憶體位址。事實上,字串是屬於字元陣列,陣列 (array) 為 C 語言的衍生資料型態之一,其為相同資料型態的資料體,這意思是說,陣列中可以有很多個相同資料型態的元素。因此將 "kaiching" 指派給變數 name ,雖然實際上 name 中所存放的是字元 'k' 的記憶體位址,但往後用 name 便可直接存取整個 "kaiching" 字串。


至於整數及浮點數的常數很容易判別,凡是帶有小數點的數字皆為浮點數,不帶有小數點的數字皆為整數,如
0.0065 // 浮點數 0.006500
21.35  // 浮點數 21.350000
6321.  // 浮點數 6321.000000
6321   // 整數 6321
55     // 整數 55
0      // 整數 0


因此簡單例子中的變數 month 、 day 、 hour 、 min 、name 經過 8 到 12 行的指派運算,可視為各變數中儲存 7 、 27 、 9 、 45 、 "kaiching" 等常數數值。


問題與討論
  1. C 語言有哪些常數種類呢?
  2. 什麼叫做指派運算?
  3. ASCII 有哪些是可見字元?又有哪些是不可見字元呢?
  4. 陣列是什麼?
  5. 字元陣列跟字串有什麼樣的關係呢?
  6. 為什麼可以用指向某個字元的指標存取字串呢?




沒有留言: