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



似乎argv[argc]总是NULL,所以我认为我们可以在没有argc的情况下遍历参数列表。一个单独的while循环将完成此操作。

如果argv的末尾总是有一个NULL,为什么我们需要argc

是的,保证argv[argc]==NULL。参见C11 5.1.2.2.1程序启动(我的重点)

如果已声明,则主函数的参数应遵守以下限制:

argc的值应为非负。argv[argc]应为null指针

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

编辑:该问题已被修改为包含C++。n3337草案3.6.1主要功能表示

2。。。argc应为从运行程序的环境。。。。argc的值应为非阴性argv[argc]的值应为0

是的,argv[argc]保证为空指针。使用CCD_ 11是为了方便。

引用C99基本原理的官方解释,注意单词冗余检查

国际标准的基本原理——程序设计语言——C§5.1.2.2.1程序启动

argcargv作为main的自变量的规范认可了广泛的先前实践。argv[argc]需要是一个空指针,以提供对列表末尾的冗余检查,这也是基于常见做法。

这是由于历史原因以及与旧代码的兼容性。最初,不能保证存在一个空指针作为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提供给我,而不是必须编写代码,在逻辑需要时单独给我计数(在某些情况下可能会发生这种情况)

相关内容

  • 没有找到相关文章