發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標 題: 星星流講座 0002
發信站: ☆清華電機☆ (Mon May 1 09:59:14 1995)
轉信站: star
星星流講座 0002 C 語言教室
第 1 講 之 2 A whole new world
Topic: C 語言程式的基本架構
現在回到我們剛剛輸入的程式上,我們來看看到底它是如何工作的,先看第一行:
/* hello.c */
這種用 /* 和 */ 括起來的東西叫註解 (remark),是用來註解程式用的。註解會
被編譯器完全地忽略,這是 C 語言比較特殊的地方,請特別注意。
好的程式應該有簡明恰當的註解。再來看到:
#include <stdio.h>
以 # 開頭的東西叫編譯指示 (compiler directives),它的作用是指示編譯器照
著編譯指示去編譯你的程式。#include 的意思就是在編譯這個程式之前,請編譯
器先引入標頭檔 (header file) 加以編譯,編譯完之後再編譯本程式下面的部份
。所以說呢,#include <stdio.h> 的意思就是叫 compiler 先編譯 stdio.h 這個
檔然後再編譯下面的程式。我們以一個簡單的流程圖表示如下:
gcc 編譯 hello.c
↓
看到了 #include <stdio.h>
↓
gcc 去找尋 stdio.h
↓ 找到了
gcc 先編譯 stdio.h
↓ 編譯完畢
gcc 再編譯 hello.c 剩下的部份
↓ 編譯完畢
gcc 呼叫 ld 來連結
↓
hello 這個程式製作完畢
你也可以把 #include <stdio.h> 寫成 #include "/usr/include/stdio.h",
可以得到同樣的效果。那麼,#include 後面接角括號 < > 和雙引號 " " 有何不同呢?
角括號括起來的檔案通常表示那個檔案是個標準標頭檔 (standard header file)。如果
是標準標頭檔,編譯器會到某個固定的地方去找這個檔案(至於是那個地方那就不一定了
,看當初安裝系統的時候是怎麼裝的)。用雙引號括起來的檔案通常表示那是個使用者自
定的標頭檔 (user-defined header file),所以你必須給編譯器完整的路徑 (file
path) 它才能找的到。
再來我們看到:
main ()
{
printf ("Hello, world!\n");
}
main 是一個函數,也是 C 程式的主體 (不然叫 main 做啥?),你的程式會
由 main 函數開始執行。printf 是另一個函數,它負責顯示訊息到螢幕上。
C 語言中函數的意義我們以後會講,你現在只要知道 main () 是一個函數,
printf () 也是一個函數就可以了。那兩個大括號 { } 是幹什麼用的?
用大括號括起來的東西,我們叫它做一個程式區塊 (program block)。緊
跟在函數定義後的程式區塊叫函數本體 (function body),也就是說,
{
printf ("Hello, world!\n");
}
這個程式區塊就是 main () 這個函數的函數本體。再來仔細看這一行:
printf ("Hello, world!\n");
看到行末的分號了沒? 程式區塊中的每一行都要以分號來表示這一行結束了。
Q: 分號代表一行的結束,可是我的程式這樣寫為什麼不對?
/* hello.c */
#include <stdio.h>
main ()
{
printf ("Hello, world!
\n");
}
編譯結果:
[thccy14]/Oz/u/u80/ee/u801833/program> cc -o hello hello1.c
"hello1.c", line 7: newline in string or char constant
"hello1.c", line 8: illegal character: '\'
"hello1.c", line 8: syntax error at or near variable name "n"
"hello1.c", line 8: syntax error at or near variable name "n"
"hello1.c", line 8: newline in string or char constant
A: 因為標準 C 中這種做法是不允許的,你必須寫成
/* hello1.c */
#include <stdio.h>
main ()
{
printf ("Hello, world!\
\n");
}
才可以,也就是若是下一行和上一行是同一行的話,上一行的行尾必
須加上倒斜線 \ 來表示。