前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++中关于main函数的几点说明

C++中关于main函数的几点说明

作者头像
恋喵大鲤鱼
发布2018-08-03 16:46:41
9180
发布2018-08-03 16:46:41
举报
文章被收录于专栏:C/C++基础C/C++基础

main函数是C++程序的入口函数,C++标准要求main()函数的返回值类型为int。

1.函数内并可以不出现return语句

当main()函数的返回值为int,而函数内并没有出现return语句时,同样可以通过编译并正常运行。这是因为编译器在main()函数的末尾自动添加了return 0;的语句。所以,main()函数是C++程序经过特殊处理的函数。其他的返回值类型不是void的函数,如果没有使用return语句,编译器将报错。

2.VS环境下mian函数的返回值可以是数值类型,如char,float,double或者long

VS环境下对main函数的返回值没有太严格的要求,只要可以强制转换为int的类型都可以作为返回值,显而易见,string是不能作为main函数的返回值。参考如下程序。

代码语言:javascript
复制
#include <iostream>
using namespace std;

char main()
{
    cout<<"Hello!"<<endl;
    getchar();
    return '0';
}

如果将返回类型换成string类型,编译不通过,读者可自行验证。当然,以上代码不具有可移植性,在Linux环境下使用g++编译不会通过,提示返回值类型必须为int,可见g++更加严格的实现C++标准的内容。

3.Windows平台,可通过环境变量errorlevel获取C++应用程序main函数的返回值

依据返回值作出不同的响应。编写如下程序。

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
    int i;
    cout<<"please input a number"<<endl;
    cin>>i;
    return i;
}

此程序编译生成main.exe然后编写一个批处理文件test.bat,内容如下:

代码语言:javascript
复制
@echo off
main.exe
if %errorlevel%==3 echo third
if %errorlevel%==2 echo second
if %errorlevel%==1 echo first

当我们运行此批处理文件,从控制台输入1,得到first,输入2,得到second,输入3,得到third。运行截图如下:

这个实验说明了程序main.exe运行时,main()函数的返回值被存放在环境变量errorlevel中,我们可以在批处理文件中利用这个返回值采用去不同的行动。

在main()函数中,将语句return I;改成函数调用exit(i);,这个程序的执行结果不发生变化。exit(i)的执行效果是返回操作系统,并将i作为程序的返回结果。exit用于结束进程,返回进程结束代码给操作系统,return用于结束函数调用,返回函数结束代码给调用者。在main()函数中,return和exit均可达到结束程序,返回结果给操作系统。在C语言程序中,当程序出现无法恢复的错误时,就可以使用exit()函数退出程序。但是在C++程序中,exit()函数的使用会破坏程序对对象的析构函数的调用。在C++程序设计中,应利用异常处理机制来取代对exit()函数的调用。

关于批处理文件的几点说明。 (1)@符号出现在命令前表示关闭命令回显,即执行命令时,控制台不会出现命令的具体内容,只会出现命令的执行结果; (2)echo off这条命是关闭所有命令回显,加上@符号表示关闭本条命令的回显; (3)%a% 这种形式 ,表示对变量a的引用。

4.main()函数被称为“入口函数”,那main()函数一定是程序中的第一个被执行的函数吗?

考察如下程序。

代码语言:javascript
复制
#include <iostream>
using namespace std;
class A{
public:
    A(){
        cout<<"In default A constructor"<<endl;
    }
};
A b;
int main()
{
    cout<<"In main()"<<endl;
    return 0;
}

编译运行以上代码输出:

代码语言:javascript
复制
Indefault A's constructorIn main()

在这个程序中,先输出的“In default constructor”,然后输出的是“In main()”。可见,对象a的构造函数是先于main()函数执行的。实际上,所有的外部对象的构造函数都是先于main()函数执行的。如果要对类中的成员对象进行初始化,那么这些对象的构造函数也是在main()函数之前执行的。如果在这些构造函数中还调用了其他函数的话,就可以是更多的函数先于main()函数之前运行。因此main()函数不一定是C++程序的第一个被执行的函数。

5.main()函数可以带参数

main()函数带参数是用来提供用户向程序输入参数。main()所带的参数有固定格式,即int main(int argc,char* argv[]),其中argc代表参数的个数,argv数组中的每一个元素则保存命令行参数内容的字符串。考察如下程序。

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
    if(argc>1)
    cout<<"Hello "<<argv[1]<<endl;
    return 0;
}

假设此程序经过编译之后生成的main.exe,那么在控制台输入”main.exe LVLV”,会输出“Hello LVLV”。使用命令行参数时注意以下几个问题。 (1)命令行输入的程序名称为程序的第一个参数,以上程序中argv[0]保存的是main.exe,尽管输入的只有一个参数”LVLV”,但是参数数量argc包含了程序名称,因此argc等于2。在其他编程语言(如C#)中,命令行参数并不包含执行文件的名字。 (2)在命令行中,空格被认为是命令行参数的分割符。也就是说,也就是说同一个参数内部不允许出现空格。如果在一个参数中出现空格,可以使用双引号括起来。如输入main.exe “LVLV and JF”。


参考文献

[1]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008[3.1 关于main()函数(P91-P94)].

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年10月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.函数内并可以不出现return语句
  • 2.VS环境下mian函数的返回值可以是数值类型,如char,float,double或者long
  • 3.Windows平台,可通过环境变量errorlevel获取C++应用程序main函数的返回值
  • 4.main()函数被称为“入口函数”,那main()函数一定是程序中的第一个被执行的函数吗?
  • 5.main()函数可以带参数
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档