这里有两三个不同的小奥秘。不知道你想知道哪一个,所以我想我会回答所有三个。
答案:
(1) 很久以前,在相当长的一段时间以前,在 C 语言的黎明(或至少是早晨),函数定义语法是不同的。你没说
int main(int argc, char *argv[])
{
...
}
相反,你说
int main(argc, argv)
int argc;
char *argv[];
{
...
}
那时“隐式int”也风靡一时。所以如果你只是写了
int main(argc, argv)
char *argv[];
{
...
}
编译器说“好的,有一个参数argv,它是一个char **,还有一个参数argc,它是一个......哦,你没有说,所以我只是静静地假设int。”
由于 C 在向后兼容性方面一直非常重视,许多编译器今天仍然接受旧语法,即使它已经正式过时了一段时间。
(2) 另外,在您的情况下,您完全放弃了 argv 部分。 main 应该有两个参数,这是程序启动时系统调用它的方式,但你只声明它接受一个。那么为什么它会起作用呢?
严格来说,当使用与预期数量不同的参数调用函数时,行为是未定义的,但这是您经常可以避免的事情,尤其是在传递的参数多于预期的情况下。因此,尽管系统传递了您的程序没有预料到的第二个 argv 参数,但额外的参数只是被悄悄地丢弃了。
(3) 那么,1 是从哪里来的呢?嗯,这是因为main 的传统argc 和argv 参数的实际含义。 C 的main 定义基于命令行调用。通常人们会输入类似的东西
programname somefilename someotherargument
然后按回车键。这会调用一个名为programname 的程序,它带有两个命令行参数somefilename 和someotherargument。那么这些是如何传递给main的呢?
嗯,argc 是对其中有多少个的计数,argv 是参数字符串本身的数组(v 代表“向量”)。并且参数列表始终包含程序名称本身。所以如果你调用
programname somefilename someotherargument
然后argc 以 3 的形式出现,argv 以数组的形式出现
{ "programname", "somefilename", "someotherargument", NULL }
但是如果你调用不带参数的东西,那么argc 仍然是 1。所以这就是你看到的 1 的来源。