每個(gè)C++程序都包含一個(gè)或多個(gè)函數(shù)(function),其中一個(gè)必須命名為main。操作系統(tǒng)通過(guò)調(diào)用main來(lái)運(yùn)行C++程序。下面是一個(gè)非常簡(jiǎn)單的main函數(shù),它什么也不干,只是返回給操作系統(tǒng)一個(gè)值:
創(chuàng)新互聯(lián)公司專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、灌南網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5建站、商城網(wǎng)站定制開(kāi)發(fā)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為灌南等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
int main()
{
return 0;
}
一個(gè)函數(shù)的定義包含四部分:返回類型(return type)、函數(shù)名(function name)、一個(gè)括號(hào)包圍的形參列表(parameterlist,允許為空)以及函數(shù)體(function body)。雖然main函數(shù)在某種程度上比較特殊,但其定義與其他函數(shù)是一樣的。
在本例中,main的形參列表是空的(()中什么也沒(méi)有)。6.2.5節(jié)(第218頁(yè))將會(huì)討論main的其他形參類型。
main函數(shù)的返回類型必須為int,即整數(shù)類型。int類型是一種內(nèi)置類型(built-in type),即語(yǔ)言自身定義的類型。
函數(shù)定義的最后一部分是函數(shù)體,它是一個(gè)以左花括號(hào)(curly brace)開(kāi)始,以右花括號(hào)結(jié)束的語(yǔ)句塊(block of statements):
{
return 0;
}
這個(gè)語(yǔ)句塊中唯一的一條語(yǔ)句是return,它結(jié)束函數(shù)的執(zhí)行。在本例中,return還會(huì)向調(diào)用者返回一個(gè)值。當(dāng)return語(yǔ)句包括一個(gè)值時(shí),此返回值的類型必須與函數(shù)的返回類型相容。在本例中,main的返回類型是int,而返回值0的確是一個(gè)int類型的值。
請(qǐng)注意,return語(yǔ)句末尾的分號(hào)。在C++中,大多數(shù)C++語(yǔ)句以分號(hào)表示結(jié)束。它們很容易被忽略,但如果忘記了寫分號(hào),就會(huì)導(dǎo)致莫名其妙的編譯錯(cuò)誤。
在大多數(shù)系統(tǒng)中,main的返回值被用來(lái)指示狀態(tài)。返回值0表明成功,非0的返回值的含義由系統(tǒng)定義,通常用來(lái)指出錯(cuò)誤類型。
重要概念:類型
類型是程序設(shè)計(jì)最基本的概念之一,在本書中我們會(huì)反復(fù)遇到它。一種類型不僅定義了數(shù)據(jù)元素的內(nèi)容,還定義了這類數(shù)據(jù)上可以進(jìn)行的運(yùn)算。
程序所處理的數(shù)據(jù)都保存在變量中,而每個(gè)變量都有自己的類型。如果一個(gè)名為v的變量的類型為T,我們通常說(shuō)“v具有類型T”,或等價(jià)的,“v是一個(gè)T類型變量”。
、運(yùn)行程序
編譯、運(yùn)行程序
編寫好程序后,我們就需要編譯它。如何編譯程序依賴于你使用的操作系統(tǒng)和編譯器。你所使用的特定編譯器的相關(guān)使用細(xì)節(jié),請(qǐng)查閱參考手冊(cè)或詢問(wèn)經(jīng)驗(yàn)豐富的同事。
很多PC機(jī)上的編譯器都具備集成開(kāi)發(fā)環(huán)境(Integrated Developed Environment,IDE),將編譯器與其他程序創(chuàng)建和分析工具包裝在一起。在開(kāi)發(fā)大型程序時(shí),這類集成環(huán)境可能是非常有用的工具,但需要一些時(shí)間來(lái)學(xué)習(xí)如何高效地使用它們。學(xué)習(xí)如何使用這類開(kāi)發(fā)環(huán)境已經(jīng)超出了本書的范圍。
大部分編譯器,包括集成IDE的編譯器,都會(huì)提供一個(gè)命令行界面。除非你已經(jīng)了解IDE,否則你會(huì)覺(jué)得借助命令行界面開(kāi)始學(xué)習(xí)C++還是很容易的。這樣學(xué)習(xí)方式的好處是,可以先將精力集中于C++語(yǔ)言本身(而不是一些開(kāi)發(fā)工具),而且,一旦你掌握了語(yǔ)言,IDE通常是很容易學(xué)習(xí)的。
無(wú)論你使用命令行界面或者IDE,大多數(shù)編譯器都要求程序源碼存儲(chǔ)在一個(gè)或多個(gè)文件中。程序文件通常被稱為源文件(source file)。在大多數(shù)系統(tǒng)中,源文件的名字以一個(gè)后綴為結(jié)尾,后綴是由一個(gè)句點(diǎn)后接一個(gè)或多個(gè)字符組成的。后綴告訴系統(tǒng)這個(gè)文件是一個(gè)C++程序。不同編譯器使用不同的后綴命名約定,最常見(jiàn)的包括.cc、.cxx、.cpp、.cp及.C。
如果我們正在使用命令行界面,那么通常是在一個(gè)控制臺(tái)窗口內(nèi)(例如UNIX系統(tǒng)中的外殼程序窗口或者Windows系統(tǒng)中的命令提示符窗口)編譯程序。假定我們的main程序保存在文件prog1.cc中,可以用如下命令來(lái)編譯它
$ CC prog1.cc
其中,CC是編譯器程序的名字,$是系統(tǒng)提示符。編譯器生成一個(gè)可執(zhí)行文件。Windows系統(tǒng)會(huì)將這個(gè)可執(zhí)行文件命名為prog1.exe。UNIX系統(tǒng)中的編譯器通常將可執(zhí)行文件命名為a.out。
為了在Windows系統(tǒng)中運(yùn)行一個(gè)可執(zhí)行文件,我們需要提供可執(zhí)行文件的文件名,可以忽略其擴(kuò)展名.exe:
$ prog1
在一些系統(tǒng)中,即使文件就在當(dāng)前目錄或文件夾中。你也必須顯式指出文件的位置。在此情況下,我們可以鍵入
$ .\prog1
“.”后跟一個(gè)反斜線指出該文件在當(dāng)前目錄中。
為了在UNIX系統(tǒng)中運(yùn)行一個(gè)可執(zhí)行文件,我們需要使用全文件名,包括文件擴(kuò)展名:
$ a.out
如果需要指定文件位置,需要用一個(gè)“.”后跟一個(gè)斜線來(lái)指出可執(zhí)行文件位于當(dāng)前目錄中。
$ ./a.out
訪問(wèn)main的返回值的方法依賴于系統(tǒng)。在UNIX和Windows系統(tǒng)中,執(zhí)行完一個(gè)程序后,都可以通過(guò)echo命令獲得其返回值。
在UNIX系統(tǒng)中,通過(guò)如下命令獲得狀態(tài)
$ echo $?
在Windows系統(tǒng)中查看狀態(tài)可鍵入
$ echo %ERRORLEVEL%
運(yùn)行GNU或微軟編譯器
在不同操作和編譯器系統(tǒng)中,運(yùn)行C++編譯器的命令也各不相同。最常用的編譯器是GNU編譯器和微軟Visual Studio編譯器。默認(rèn)情況下,運(yùn)行GNU編譯器的命令是g++:
$g++ -o prog1 prog1.cc
此處,$是系統(tǒng)提示符。-o prog1是編譯器參數(shù),指定了可執(zhí)行文件的文件名。在不同的操作系統(tǒng)中,此命令生成一個(gè)名為prog1或prog1.exe的可執(zhí)行文件。在UNIX系統(tǒng)中,可執(zhí)行文件沒(méi)有后綴;在Windows系統(tǒng)中,后綴為.exe。如果省略了-o prog1參數(shù),在UNIX系統(tǒng)中編譯器會(huì)生成一個(gè)名為a.out的可執(zhí)行文件,在Windows系統(tǒng)中則會(huì)生成一個(gè)名為a.exe的可執(zhí)行文件(注意:根據(jù)使用的GNU編譯器的版本,你可能需要指定-std=c++0x參數(shù)來(lái)打開(kāi)對(duì)C++11的支持)。
運(yùn)行微軟Visual Studio 2010編譯器的命令為cl:
C:\Users\me\Programs>cl /EHsc prog1.cpp
此處,C:\Users\me\Programs>是系統(tǒng)提示符,\Users\me\Programs是當(dāng)前目錄名(即當(dāng)前文件夾)。命令cl調(diào)用編譯器,/EHsc是編譯器選項(xiàng),用來(lái)打開(kāi)標(biāo)準(zhǔn)異常處理。微軟編譯器會(huì)自動(dòng)生成一個(gè)可執(zhí)行文件,其名字與第一個(gè)源文件名對(duì)應(yīng)??蓤?zhí)行文件的文件名與源文件名相同,后綴為.exe。在此例中,可執(zhí)行文件的文件名為prog1.exe。
編譯器通常都包含一些選項(xiàng),能對(duì)有問(wèn)題的程序結(jié)構(gòu)發(fā)出警告。打開(kāi)這些選項(xiàng)通常是一個(gè)好習(xí)慣。我們習(xí)慣在GNU編譯器中使用-Wall選項(xiàng),在微軟編譯器中則使用/W4。
更詳細(xì)的信息請(qǐng)查閱你使用的編譯器的參考手冊(cè)。
練習(xí)
練習(xí)1:查閱你使用的編譯器的文檔,確定它所使用的文件命名約定。編譯并運(yùn)行第2頁(yè)的main程序。
練習(xí)2:改寫程序,讓它返回-1。返回值-1通常被當(dāng)作程序錯(cuò)誤的標(biāo)識(shí)。重新編譯并運(yùn)行你的程序,觀察你的系統(tǒng)如何處理main返回的錯(cuò)誤標(biāo)識(shí)。
本文節(jié)選自《C++ Primer中文版(第5版)》
【美】Stanley B.Lippman( 斯坦利 李普曼) Josee Lajoie(約瑟 拉喬伊 ) Barbara E. Moo (芭芭拉 默) 著
王剛 楊巨峰 譯
電子工業(yè)出版社出版