C 中 int main() 的参数
Arguments of int main() in C
请解释以下程序的输出:
#include <stdio.h>
int main(i) {
printf("i=%d\n",i);
return 0;
}
输出:
我=1
在托管环境中,至少有两个 main
的有效签名:
int main(void)
int main(int, char **)
对于第二种形式,传统的参数名称是argc
和argv
:
int main(int argc, char **argv)
如果它能逃脱惩罚,那么安排它总是最初调用的实现是合理的
main(argc, argv)
来自其 运行 时间启动代码,并且如果用户已声明
int main(void)
只忽略“额外”参数。 (根据所使用的函数调用机制的细节,可能会也可能不会传递“额外”参数并让它们被安静地忽略,而不会导致任何问题——但这种情况很常见。)
在您发布的代码中,main
的声明完全不同:
int main(i)
这是一个“旧式”(K&R1) 函数定义,其中参数默认类型为 int
。所以这和
是一样的
int main(int i)
但不清楚为什么有人会尝试用这样的一个参数声明 main
。它是非标准的,不能保证有效,也没有充分的理由这样做。然而,如果你在一个 运行 时间启动代码总是传递两个参数的平台上,并且额外的参数被安静且无害地忽略,那么这段代码可能最终会在它的 argc
i
参数。
正如评论中所建议的,如果您能够从命令行调用您的测试程序,或者以其他方式传递命令行参数,您可以尝试使用不同数量的命令行调用它参数,看看你是否得到不同的结果。
当你没有传递命令行参数时得到 1
的原因是被调用程序的名称通常作为 argv[0]
传递,所以 argc
几乎总是在至少 1.
但如前所述,这是非标准的,不能保证有效。它可以很容易地什么也不做,或者打印“Rumpelstiltskin!”,或者崩溃。
请解释以下程序的输出:
#include <stdio.h>
int main(i) {
printf("i=%d\n",i);
return 0;
}
输出: 我=1
在托管环境中,至少有两个 main
的有效签名:
int main(void)
int main(int, char **)
对于第二种形式,传统的参数名称是argc
和argv
:
int main(int argc, char **argv)
如果它能逃脱惩罚,那么安排它总是最初调用的实现是合理的
main(argc, argv)
来自其 运行 时间启动代码,并且如果用户已声明
int main(void)
只忽略“额外”参数。 (根据所使用的函数调用机制的细节,可能会也可能不会传递“额外”参数并让它们被安静地忽略,而不会导致任何问题——但这种情况很常见。)
在您发布的代码中,main
的声明完全不同:
int main(i)
这是一个“旧式”(K&R1) 函数定义,其中参数默认类型为 int
。所以这和
int main(int i)
但不清楚为什么有人会尝试用这样的一个参数声明 main
。它是非标准的,不能保证有效,也没有充分的理由这样做。然而,如果你在一个 运行 时间启动代码总是传递两个参数的平台上,并且额外的参数被安静且无害地忽略,那么这段代码可能最终会在它的 argc
i
参数。
正如评论中所建议的,如果您能够从命令行调用您的测试程序,或者以其他方式传递命令行参数,您可以尝试使用不同数量的命令行调用它参数,看看你是否得到不同的结果。
当你没有传递命令行参数时得到 1
的原因是被调用程序的名称通常作为 argv[0]
传递,所以 argc
几乎总是在至少 1.
但如前所述,这是非标准的,不能保证有效。它可以很容易地什么也不做,或者打印“Rumpelstiltskin!”,或者崩溃。