Linux編譯環(huán)境
編寫的 C 語言程序常以.c
結(jié)尾,如main.c
。對于main.c
文件盗蟆,可通過執(zhí)行
gcc -o program main.c
進行編譯(compile)镜撩,告訴一個叫gcc
的編譯器预柒,我要編譯生成一個名叫program
的可執(zhí)行文件(用-o program
進行說明),被編譯的代碼文件是main.c
袁梗。
如編譯成功宜鸯,在同一個目錄下可得到一個編譯后的可執(zhí)行的program
程序。再通過執(zhí)行./program
的方式你就可以運行這個程序了遮怜。
在我們輸入命令之前,在第一行的是 命令提示符(prompt)→ ~/project
淋袖。我們在它之后加上ls -l
就編譯了。
步驟
先
ls -l
然后
gcc -o program main.c
然后
ls -l
然后執(zhí)行
./program
就編譯運行成功啦锯梁。
-c
和-o
都是gcc
編譯器的可選參數(shù)
-c
表示只編譯(compile)源文件但不鏈接即碗,會把.c
或.cc
的c源程序編譯成目標文件,一般是.o
文件陌凳。
-o
用于指定輸出(out)文件名剥懒。不用-o
的話,一般會在當(dāng)前文件夾下生成默認的a.out
文件作為可執(zhí)行程序合敦。
例如
gcc -c test.c
將生成test.o
的目標文件
gcc -o app test.c
將生成可執(zhí)行程序app
gcc -c a.c -o a.o
表示把源文件a.c
編譯成指定文件名a.o
的中間目標文件(其實在這里蕊肥,你把-o a.o
省掉,效果是一樣的蛤肌,因為中間文件默認與源文件同名壁却,只是后綴變化)。
printf是個什么東西呢裸准?
是通過#include
這行代碼引入了一個名為stdio
(StandardInput &Ouput)的庫(library)展东,而printf
則是一個在這個庫中被定義的函數(shù)(function),引入了這個庫炒俱,就可以用這個函數(shù)了盐肃。
而其中用引號包裹的"Hello"
則被稱為printf
函數(shù)接收的一個參數(shù)(parameter 或 argument)爪膊。當(dāng)printf
函數(shù)只有一個像我們寫的"Hello"
這樣的參數(shù)時,會直接把Hello輸出砸王。
main的函數(shù)的實現(xiàn)
它是一個特殊的函數(shù)推盛,多數(shù)時候main
函數(shù)被規(guī)定為 C 語言程序運行的入口。
程序邏輯的擬寫谦铃,都需要在main
這個函數(shù)的大括號所包圍的范圍內(nèi)完成耘成。也就是說, C 語言程序被編譯驹闰、運行時瘪菌,一切有效的邏輯,將會從main
函數(shù)大括號內(nèi)第一行語句開始嘹朗。
在 C 語言中用通過[函數(shù)名] ([傳入?yún)?shù)值])
的形式調(diào)用函數(shù)师妙,
int
表示了預(yù)期的main函數(shù)的返回值類型——整數(shù)(integer),int就是取自整數(shù)英文單詞“integer”的前三個字母屹培。
return 0;
就是在main函數(shù)的結(jié)束位置將一個整數(shù)0作為main函數(shù)的返回值(return value)交給操作系統(tǒng)(operating system)默穴。操作系統(tǒng)接收到程序返回的00時就會認為程序正常結(jié)束,而如果接收到其他數(shù)值(無論是正整數(shù)還是負整數(shù))則會認為程序非正常結(jié)束褪秀。
開發(fā) C 語言程序的過程
就是包含了各自邏輯意義的子程序(subprogram)的函數(shù)們互相調(diào)用的過程(就像在main函數(shù)中調(diào)用了printf函數(shù)這樣)蓄诽。只不過這些函數(shù)中,有一些是外部庫中已定義好的溜歪,引入了庫就可以用若专,比如printf是一個在stdio的庫中已經(jīng)定義好了可以直接使用的许蓖,而另一些可能需要自己去定義蝴猪、實現(xiàn)之后才可以進一步去進行調(diào)用。
作用域
自聲明起膊爪,直至自己所在的花括號體結(jié)束自阱。
值得注意的是
作用域與生存周期是不同的。如果當(dāng)前階段作用域結(jié)束米酬,但是如果這個變量在作用域的前面也聲明過沛豌,那么作用域結(jié)束了,生存周期是沒結(jié)束的赃额。
比如
#include <stdio.h>
int main(void) {
int year;
year = 2011;
{
printf("%d\n", year);
year =2015;
}
printf("%d", year);
return 0;
}
輸出的是
2011
2015
但是如果
#include <stdio.h>
int main(void) {
int year;
year = 2011;
{
printf("%d\n", year);
int year =2015;
}
printf("%d", year);
return 0;
}
則輸出的是
2011
2011
year的生存周期改變了加派。