C++ main函數(shù)的幾點(diǎn)細(xì)節(jié)
1.main()函數(shù)的標(biāo)準(zhǔn)原型
main函數(shù)是C++程序的入口函數(shù),C++標(biāo)準(zhǔn)規(guī)定main()函數(shù)的返回值類型為int,返回值用于表示程序的退出狀態(tài),如果返回0則表示程序正常退出,如果返回非0,則表示出現(xiàn)異常。C++標(biāo)準(zhǔn)規(guī)定,main()函數(shù)原型有兩種:
int main(); int main(int argc,char* argv[]); //或 int main(int argc,char** argv);
當(dāng)main()函數(shù)的返回值為int,而函數(shù)內(nèi)沒有出現(xiàn)return語句時(shí),同樣可以通過編譯并正常運(yùn)行。這是因?yàn)榫幾g器在main()函數(shù)的末尾自動添加了return 0;語句。所以,main()函數(shù)是C++程序經(jīng)過特殊處理的函數(shù),其他的返回值類型不是void的函數(shù),如果沒有使用return語句,編譯器將報(bào)錯(cuò)。雖然編譯器會隱式添加return 0;,但還是建議開發(fā)人員避免使用這條規(guī)則,因?yàn)轱@示添加可避免出錯(cuò)時(shí)無法返回錯(cuò)誤碼,并且不會誤認(rèn)為main()函數(shù)可以沒有return語句。
main()函數(shù)參數(shù)可以用來提供用戶向程序輸入的參數(shù),采用帶參的main()函數(shù)原型,int main(int argc,char* argv[]),其中argc代表參數(shù)個(gè)數(shù),argv數(shù)組中的每一個(gè)元素保存命令行參數(shù)內(nèi)容的字符串??疾烊缦鲁绦颉?/p>
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
if(argc>1)
{
cout<<"Hello "<<argv[1]<<endl;
}
return 0;
}
假設(shè)此程序經(jīng)過編譯之后生成的main.out,那么在控制臺輸入”main.out LVLV”,會輸出“Hello LVLV”。使用命令行參數(shù)時(shí)注意以下幾個(gè)問題。
(1)命令行輸入的程序名稱為程序的第一個(gè)參數(shù),以上程序中argv[0]保存的是main.out,盡管輸入的只有一個(gè)參數(shù)”LVLV”,但是參數(shù)數(shù)量argc包含了程序名稱,因此argc等于2。在其他編程語言(如C#)中,命令行參數(shù)并不包含執(zhí)行文件的名字。
(2)在命令行中,空格被認(rèn)為是命令行參數(shù)的分隔符,也就是說同一個(gè)參數(shù)內(nèi)部不允許出現(xiàn)空格,如果在一個(gè)參數(shù)中出現(xiàn)空格,可以使用雙引號括起來。如輸入main.out “LVLV and JF”。
2.VC++ mian()函數(shù)的返回值可以是任意數(shù)值類型
VC++下對main()函數(shù)的返回值沒有太嚴(yán)格的要求,只要可以強(qiáng)制轉(zhuǎn)換為int的類型都可以作為返回值,例如char,float,double或者long。參考如下程序。
#include <iostream>
using namespace std;
char main()
{
cout<<"Hello!"<<endl;
return '0';
}
以上程序可正常編譯并運(yùn)行。顯而易見,string是不能作為main函數(shù)的返回值。如果將返回類型換成string類型,編譯將報(bào)錯(cuò),讀者可自行驗(yàn)證。當(dāng)然,以上代碼不具有可移植性,在Linux環(huán)境下使用g++編譯不會通過,提示返回值類型必須為int,可見GNU C++更加嚴(yán)格的實(shí)現(xiàn)了C++標(biāo)準(zhǔn)的內(nèi)容。
3.Windows平臺可通過環(huán)境變量errorlevel獲取main()函數(shù)返回值
依據(jù)返回值作出不同的響應(yīng)。編寫如下程序。
#include <iostream>
using namespace std;
int main()
{
int i;
cout<<"please input a number"<<endl;
cin>>i;
return i;
}
此程序編譯生成main.exe然后編寫一個(gè)批處理文件test.bat,內(nèi)容如下:
@echo off
main.exe
if %errorlevel%==3 echo third
if %errorlevel%==2 echo second
if %errorlevel%==1 echo first
當(dāng)我們運(yùn)行此批處理文件,從控制臺輸入1,得到first,輸入2,得到second,輸入3,得到third。運(yùn)行結(jié)果如下:
C:\Users\dablelv>test.bat
please input a number
2
second
這個(gè)實(shí)驗(yàn)說明了程序main.exe運(yùn)行時(shí),main()函數(shù)的返回值被存放在環(huán)境變量errorlevel中,我們可以在批處理文件中利用這個(gè)返回值采用去不同的行動。
在main()函數(shù)中,將語句return i;改成函數(shù)調(diào)用exit(i);,這個(gè)程序的執(zhí)行結(jié)果不發(fā)生變化。exit(i)的執(zhí)行效果是返回操作系統(tǒng),并將i作為程序的返回結(jié)果。exit用于結(jié)束進(jìn)程,返回進(jìn)程結(jié)束代碼給操作系統(tǒng),return用于結(jié)束函數(shù)調(diào)用,返回函數(shù)結(jié)束代碼給調(diào)用者。在main()函數(shù)中,return和exit均可結(jié)束程序,返回結(jié)果給操作系統(tǒng)。在C語言程序中,當(dāng)程序出現(xiàn)無法恢復(fù)的錯(cuò)誤時(shí),就可以使用exit()函數(shù)退出程序。但是在C++程序中,exit()函數(shù)的使用會破壞程序?qū)ο笪鰳?gòu)函數(shù)的調(diào)用。在C++程序設(shè)計(jì)中,應(yīng)利用異常處理機(jī)制來取代對exit()函數(shù)的調(diào)用。
關(guān)于批處理文件的幾點(diǎn)說明。
(1)@符號出現(xiàn)在命令前表示關(guān)閉命令回顯,即執(zhí)行命令時(shí),控制臺不會出現(xiàn)命令的具體內(nèi)容,只會出現(xiàn)命令的執(zhí)行結(jié)果;
(2)echo off這條命是關(guān)閉所有命令回顯,加上@符號表示關(guān)閉本條命令回顯;
(3)%a% 這種形式 ,表示對變量a的引用。
4.main()函數(shù)不一定是程序中第一個(gè)被執(zhí)行的函數(shù)
考察如下程序。
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"In default A's constructor"<<endl;
}
};
A b;
int main()
{
cout<<"In main()"<<endl;
return 0;
}
編譯運(yùn)行以上代碼輸出:
In default A's constructor
In main()
在這個(gè)程序中,先輸出“In default A's constructor”,然后輸出的是“In main()”??梢?,對象a的構(gòu)造函數(shù)是先于main()函數(shù)執(zhí)行的。實(shí)際上,所有外部對象的構(gòu)造函數(shù)都是先于main()函數(shù)執(zhí)行的。如果要對類中的成員對象進(jìn)行初始化,那么這些對象的構(gòu)造函數(shù)也是在main()函數(shù)之前執(zhí)行的。如果在這些構(gòu)造函數(shù)中還調(diào)用了其他函數(shù)的話,就可以有更多的函數(shù)先于main()函數(shù)之前運(yùn)行。因此main()函數(shù)不一定是C++程序的第一個(gè)被執(zhí)行的函數(shù)。
以上就是C++ main函數(shù)的幾點(diǎn)細(xì)節(jié)的詳細(xì)內(nèi)容,更多關(guān)于C++ main函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度)
這篇文章主要介紹了C語言實(shí)現(xiàn)將double/float 轉(zhuǎn)為字符串(帶自定義精度),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
學(xué)生成績管理系統(tǒng)C語言代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C語言代碼實(shí)現(xiàn)學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
visual studio code 編譯運(yùn)行html css js文件的教程
這篇文章主要介紹了visual studio code 如何編譯運(yùn)行html css js文件,本文通過圖文實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

