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

本文详细解析了C++和Java中主函数main的定义、参数传递方式及其实际应用场景,对比了两种语言中命令行参数的处理差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 

“int”自不必说,是main函数的返回类型,一般来说顺序执行返回0,错误返回1,但是对于main函数不返回值最多也只是warning,不会error,甚至连warning也没有。但是,但是建议对于int main返回一个int值。

 

 

“int argc,char* argv[]”其实从英文名可以知道:

argc : argument counter 参数计数器,即参数个数

argv:argument values 参数值,另有argument vectors,参数向量

即都是“argument”,即参数,只是比较特殊的是这是main函数的参数,一般而言我们使用:

void main()——无返回值,无参的main函数

int main(void)——返回值为int类型的无参main函数

而int main(int argc,char* argv[])则是返回类型为int,带有两个形参:一个int型变量argc,一个char*类型变量argv的main函数。

 

了解了一二两个知识,接下来可以深入研究两个arguments的具体含义。

首先,为了消除神秘感,我们完全可以写成“int main(int i,char* str[])”,这是基于——函数的形参名可以为任意符合C/C++变量命名规则的标识符。

接下来,先不直接给结论——argc/i和argv/str具体含义是什么,因为这不符合我们思考的方式——先有问题,然后才是解决方案。

先来考虑一个问题:既然main函数为程序的入口,每次程序必然从main函数进入,那么main函数的实参怎么传递进去? 对于一个普通的void printString(char* str)函数,可以在main函数中向printString()传入一个字符串指针变量来调用,但是对于main函数,我们每次Run的时候已经进入了函数内部(IDE),main函数的参数怎么传递进去呢?

解决方案是,main函数的参数不是通过IDE传入的,是通过DOS环境下才能传入,实际上,int args 和 char* argv[] 本来就称之为“命令行参数”,使用方法是:先使用编译器将特定的c++源代码文件假定为HelloWorld.cpp——>编译——>HelloWorld.obj——>链接——>HelloWorld.exe,一般的IDE就直接运行了此可执行程序,但是在DOS环境下,我们可以使用如下的方法:转到HelloWorld.exe所在路径之后,命令行格式下输入:HelloWorld.exe Tom Jerry Lena 回车,则有结果:

HelloWorld.cpp源程序:

#include <iostream>

using namespace std;

int main(int argc,char* argv[])
{
	int i;

	cout<<"参数个数为:"<<argc<<endl;     //观察argc的值

	for(i = 0;i < argc;i++)
	{
		cout<<"第"<<i+1<<"个参数为"<<argv[i]<<endl;    //取出argv的值观察
	}

	return 0;
}

命令行运行即结果:

有上面的结果也可以看到,可执行程序本身名称(Hello.exe)占据一个变量位,故可以想见,当只输入:HelloWorld.exe时结果是什么,此处不贴结果。

另外,值得注意的两点是:

① 也可以单独使用 int main(int argc),但是经实测单独使用int main(char *argv[])程序直接崩溃(只是输出argv[0],数组并没有溢出)。

② char* argv[]也可以写为char** argv 或者 char argv[][],这是属于C/C++二级数组/指针的知识。

 

另外,在Java中也有类似的情况。

因为java一切皆“类”,所有的方法只能依附于“类”才能存在,所以一般将程序的入口设在主类中(而不是像C/C++一样直接定义void main()),如下:


public class HelloWorld {
	
	public static void main(String[] args){
		System.out.println("一共有"+args.length+"个参数");
		for(int i = 0;i < args.length;i++)
			System.out.println("第"+i+1+"个参数为"+args[i]);
	}

}

程序的入口为

        public static void main(String[] args)

细究其含义

① main为方法名

② public static void 为main方法的限定符(说法不一定标准)

③ args为main方法的形参,类型为String[]

public:

因为main方法为程序入口,要被JVM(可以认为是比“其他package”更远的位置)调用,所以需要将main方法的全向设置为public(最大权限,别包可见);

static:

因为JVM在执行main方法时不需要创建对象,所以main的类型必须是static(静态的),这样可以直接通过类名调用。

void:

main不需要返回值,故void

String[] args:

形参为一个字符串数组(String[]),名称为args

 

现在的情况与C++类似,既然在IDE中main是直接运行的,那main函数的参数怎么传入呢,String[] args的含义又是什么,和C++是一样的么?

C++中是HelloWorld.cpp——HelloWorld.obj——HelloWorld.exe,然后在命令行模式下,HelloWorld.exe a b c

Java中机制是类似的,命令行模式下,HelloWorld.java——编译(javac HelloWorld.java——HelloWorld.class——运行传参(java HelloWorld a b c)。

以下是过程:

 

注意,文件名,文件类型,编码——ANSI!!

可以看到:

① 当没有参数参入时,参数个数为0个,而不是像C++还有个HelloWorld.exe。即Java中args就是传入的参数,没有即是空

② Java中,System.out.println("第"+i+1+"个参数为"+args[i]);会自动进行字符串拼接,即“第”的出现已经将print的内容限制为了String类型(理解为强制类型转换的最高级),后面的不带括号的表达式将不再进行计算。所以要修改代码:

      System.out.println("第"+(i+1)+"个参数为"+args[i]);

结果如下:

③ 注意,CPP中利用二维字符指针来存储多个参数名(字符串)—— char* argv[],其没有使用CPP已经支持的string类型,效果等同于 string argv[];

 Java 使用了内置的String类型,并且是String[] args ,而不是String args[]。

 

 

参考资料:

http://tieba.baidu.com/p/1390711590

 

 

声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值