为什么我们需要 argc,而 argv 的结尾总是有一个 null?

看起来 argv[argc]总是 NULL,所以我认为我们可以在没有 argc的情况下遍历参数列表。一个 while循环就可以做到这一点。

If there is always a NULL at the end of argv, why do we need an argc?

8676 次浏览

是的,argv[argc]==NULL是保修的。参见 C115.1.2.2.1程序启动(我的重点)

如果它们被声明,那么主函数的参数应该服从 制约因素如下:

Argc 的值应该是非负的。 Argv [ argc ]应为空 指针

因此,提供 argc并不重要,但仍然很有用。其中,它允许快速检查传递的参数数量是否正确。

编辑: 问题已经修改为包括 C + + . n3337草案 3.6.1主要功能

2. argc 应该是传递给程序的参数数量 the environment in which the program is run. .... The value of argc 应该是非阴性的。 Argv [ argc ]的值应为0

这是出于历史原因,以及与旧代码的兼容性。最初,不能保证 argv 数组的最后一个元素是空指针。但是弧光有 一直都是存在。

Yes, argv[argc] is guaranteed to be a null pointer. argc is used for convenience.

引用 C99基本原理的官方解释,注意字 多余的检查:

国际标准ーー程序设计语言ーー C 5.1.2.2.1 < em > 程序启动

argcargv的规范作为 main的参数承认了广泛的先前实践。argv[argc]需要一个空指针来为列表的末尾提供一个冗余检查,也是基于通常的做法。

我们“需要”它,因为它是各种标准所要求的。

我们可以完全忽略这个值,但是因为它是 main的第一个参数,所以必须将它放在参数列表中。在 C + + 中(可能还有非标准的 C 语言) ,你可以省略参数名,就像下面这段 C + + 代码片段(很容易转换成 C 语言) :

#include <stdio.h> // C-compatible include, guarantees puts in global namespace


// program will print contents of argv, one item per line, starting from argv[0]


int main(int /*argc*/, char *argv[]) { // uncomment argc for C


//(void)argc; // uncomment statement for C


for (int i=0; argv[i]; ++i) {
puts(argv[i]);
}


return 0;
}

在标准 C 中,使用通用警告设置,未使用的参数生成警告,这可以通过类似 (void)argc;的语句修复,该语句使名称被使用,而不生成任何代码。

argc是很好的,因为否则许多程序将需要遍历参数来获得计数。此外,在许多具有长度数组的编程语言中,没有任何 argc参数,只有一个包含项的数组。

  • 在需要从输入列表中访问最后一个参数的情况下,使用 argv[argc - 1]比循环更方便。
  • argc提供给我比编写在逻辑需要时分别给我计数的代码更好(更干净)(在某些情况下可能会发生这种情况)。