官术网_书友最值得收藏!

1.#include, using namespace std, int main分別是什么意思?我的第一個C程序

本節(jié)的目的就是讓讀者看一看C++程序長什么樣,更重要的,我們希望讀者能把原來初學時不明白的地方都弄明白。通過本節(jié),讀者會對C++有一個大體的認識。本節(jié)的知識較為基礎(chǔ),如果對于示例代碼1.1沒有任何疑問,完全可以跳過本節(jié)。如果對Java語言更感興趣,也可以直接進入下一節(jié)。

Hello world!

相信每個程序員接觸的第一個程序都是“Hello world”,我們要認識的第一個C++程序也不例外。

示例代碼1.1

    #include <iostream>
    #define HELLO_WORLD "Hello world!"
    using namespace std;
    int main()
    {
       cout<<HELLO_WORLD<<endl;
       return 0;
    }

文件包含

示例代碼1.1的第一行#include <iostream>是文件包含指令,該指令的作用是在編譯預(yù)處理時,將指定源文件的內(nèi)容復(fù)制到當前源文件中,如圖1.1所示。以示例代碼1.1為例,在該段代碼被編譯之前,iostream文件內(nèi)容會被復(fù)制到當前文件的起始位置,替代原先的#include <iostream>。為什么要在文件的第一行寫這樣一句指令呢?我們希望在屏幕上打印“Hello world”,就需要用到標準輸出cout,這是一個負責程序?qū)ν廨敵龅膶ο?,而該對象是在iostream文件中定義的。簡單地說,iostream文件為我們提供了輸入輸出功能。

圖1.1 文件包含指令作用示意圖

讀者你也許注意到了,在#include <iostream>后面并沒有添加分號,所以這一行并不是一條C語句,而是一個預(yù)處理指令。預(yù)處理指令是編譯器在將程序編譯為機器語言之前首先會對程序進行的預(yù)處理。常見的預(yù)處理指令包括文件包含、宏定義和條件編譯,接下來我們進一步了解宏定義的概念。

宏定義

示例代碼1.1的第二行#define HELLO_WORLD "Hello world!"是一條宏定義,該指令的作用是在編譯預(yù)處理時,將源文件中所有的HELLO_WORLD都替換為"Hello world!",于是示例代碼1.1的第6行cout<<HELLO_WORLD<<endl;會變?yōu)閏out<<"Hello world!"<<endl;。宏定義也是一種預(yù)處理指令,該指令在編譯器編譯之前被執(zhí)行。

很多初學C語言的同學分不清宏定義與const常量的區(qū)別。宏定義只是在編譯預(yù)處理階段進行替換,并不會在內(nèi)存中生成對應(yīng)的變量。而const常量是一個在內(nèi)存中分配了空間的只讀變量。所以這兩者有本質(zhì)上的區(qū)別。

命名空間

示例代碼1.1的第三行using namespace std;表示使用命名空間std。命名空間是指各種標識符的可見范圍。C++標準程序庫中的所有標識符都被定義在一個std的命名空間中。如果不在示例代碼中使用using namespace std;這一行語句,想要使代碼通過編譯,就需要將示例代碼第6行的cout<<HELLO_WORLD<<endl;修改為std::cout<<HELLO_WORLD<<std::endl;。

我們可以將命名空間想象成區(qū)號,將類名想象為一個電話號碼。由于各省市的電話號碼可能重復(fù),就通過在電話號碼前面加上區(qū)號使得該號碼成為一個獨一無二的表示。Java中也有類似的機制,包名就如同區(qū)號,類名就如同電話號碼。

main函數(shù)

接下來代碼進入了主體部分——main函數(shù)。main函數(shù)是C++程序的入口函數(shù),是程序執(zhí)行的起點。該函數(shù)與其他的函數(shù)在形式上沒有什么區(qū)別,也由返回類型、函數(shù)名和函數(shù)參數(shù)組成。

返回類型:C++規(guī)定,main函數(shù)返回類型是int型。返回值用于告訴程序的調(diào)用者(即操作系統(tǒng)),程序的退出狀態(tài)。若返回0,則表示程序正常退出,若返回其他非0值,表示程序異常退出,返回其他數(shù)字的含義由系統(tǒng)決定。所以在示例代碼1.1的第7行,我們定義了語句return 0;用來告訴操作系統(tǒng),函數(shù)正常執(zhí)行完畢。該返回值并不屬于打印到屏幕上的內(nèi)容,很多初學者在一開始會混淆返回值和標準輸出的概念。

函數(shù)參數(shù):C++中,main函數(shù)一共有以下兩種定義方式:

    int main( )
    int main( int argc, char *argv[] )

示例代碼1.1采用的是第一種定義方式,即沒有函數(shù)參數(shù)。本章最后的進階部分給出了采用第二種定義方式的示例代碼1.2,并闡述了函數(shù)參數(shù)所表達的意義。

函數(shù)主體:我們通過語句cout<<HELLO_WORLD<<endl;打印"Hello world!"到屏幕。cout是標準輸出流對象,調(diào)用后會向輸出設(shè)備輸出內(nèi)容;<<負責向?qū)ο骳out發(fā)送輸出的字符串;endl也是iostream中定義的一個對象,向標準輸出發(fā)送endl類似于在控制臺窗口中按下Enter鍵。

示例代碼1.1的運行結(jié)果如圖1.2所示。

圖1.2 示例代碼1.1的運行結(jié)果

進階

對于main函數(shù)的第二種定義方式,argc表示傳入main函數(shù)的參數(shù)的個數(shù),argv[]存放著這些參數(shù),在argv[]的這些參數(shù)中,第一個參數(shù)是程序的全名。我們提供一個以第二種方式定義main函數(shù)的程序,見示例代碼1.2。

示例代碼1.2

    #include <iostream>
    using namespace std;
    int main(int argc, char *argv[])
    {
       cout<<argv[1]<<" "<<argv[2]<<endl;
       cout<<argv[0]<<endl;
       return 0;
    }

在示例代碼1.2的第5行cout<<argv[1]<<" "<<argv[2]<<endl;中,我們向標準輸出打印了argv[]的第二和第三個參數(shù),而在第6行,我們向標準輸出打印了argv[]的第一個參數(shù),為了驗證該參數(shù)即為程序的全名。

我們在Visual Studio中設(shè)置向main函數(shù)傳入的參數(shù),第一個參數(shù)為Hello,第二個參數(shù)為world!,兩個參數(shù)之間以空格隔開,如圖1.3所示。

示例代碼1.2的運行結(jié)果如圖1.4所示。

圖1.3 main函數(shù)參數(shù)設(shè)置

圖1.4 示例代碼1.2的運行結(jié)果

如圖1.4所示,程序第一行輸出了"Hello world!",即我們向main函數(shù)傳遞的參數(shù)。程序第二行輸出了程序的全名,即argv[0]。

主站蜘蛛池模板: 信丰县| 九台市| 唐海县| 榕江县| 革吉县| 贡山| 额济纳旗| 邹城市| 陇西县| 刚察县| 名山县| 襄樊市| 台江县| 年辖:市辖区| 长治县| 阳谷县| 原平市| 沁源县| 托克逊县| 特克斯县| 怀柔区| 鄂伦春自治旗| 光泽县| 朝阳区| 大渡口区| 武定县| 乌鲁木齐市| 玉树县| 金门县| 鹤岗市| 敦化市| 鄢陵县| 丰台区| 乌兰浩特市| 潮州市| 元谋县| 紫云| 海城市| 溧阳市| 武陟县| 抚宁县|