一
“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
声明:除已注明的引用外,文章系作者原创,引用转载请注明出处,如有必要请联系作者。