什么是++argv?&令人困惑的编译器错误

What is ++argv? & confusing compiler error

本文关键字:编译器 错误 ++argv 什么      更新时间:2023-10-16

这段代码是我的c++老师在一个期中考试样本中提供的。我们在非常基本的层面上讨论了argc和argv,所以我理解这些表达式本身的含义。然而,对诸如取消引用运算符和"++"之类的运算符的任何添加都会让我感到困惑,我在谷歌上搜索到的内容还不够清楚,无法将其应用于这个特定的示例。此外,当我尝试编译时,它会提供以下错误:

In function 'int summer(int*, char**)':
Line 9: error: cannot convert 'char**' to 'const char*' for argument '1' to 'int atoi(const char*)'
compilation terminated due to -Wfatal-errors.

我们还没有正式涉及指针,但我想我已经足够理解了。char**意味着你要取消引用两次,所以指针的值是char,它是指向其他东西的指针,所以第二个*意味着我们想要它的值。它是恒定的吗?因为我们依赖于命令行中的某些输入,而这些输入无法更改?我不明白。

#include <iostream>
using namespace std; 
int summer(int *acc, char * ptr[])
{
  register int n;
  n = atoi(ptr);
  *acc = *acc + n;
}
main(int argc, char * argv [])
{
  int sum = 0;
  while (--argc)
    summer(&sum, *++argv);
  cout << "sum is " << sum << endl;
}

另一个问题:当将*++argv传递给summer()时,这是否意味着(argv[]+1)的值?那会是什么?将值1加到整个向量上?我知道atoi(数组)意味着将字符串更改为数值,然后我们将其存储在寄存器int‘n’中,然后将其添加到直接在main中更改的和中。这是我真正理解的代码中唯一的一部分。对不起,如果我的问题/这篇文章有点乱。

总结一下我的问题:

  1. 编译错误消息是什么意思
  2. ++argv的作用是什么

谢谢。


编辑:

好吧,我已经做出了你们建议的改变(谢谢!!):

#include <iostream>
using namespace std; 
int summer(int *acc, char * ptr)
{
  register int n;
  n = atoi(ptr);
  *acc = *acc + n;
  return 0;
}
int main(int argc, char * argv[])
{
  int sum = 0;
  while (--argc)
    summer(&sum, *++argv);
  cout << "sum is " << sum << endl;
  return 0;
}

我还添加了返回值,因为编译器由于函数类型没有返回值而给出了一个新错误。在Codepad上,它编译并打印"和为零",然而,它仍然没有在我正在使用的Dev C++5.7.1上编译。它不显示错误消息(我一直在读的是Codepad在线编译器的错误消息),或者至少我找不到在哪里打开它们。它只是突出显示它似乎有问题的行,这仍然是atoi(ptr)的行。

*argv等价于argv[0],因此++argv;将使*argv等价于最初的argv[1]。因此,*++argv的计算结果与argv[1](程序名称后的第一个命令行参数)相同,只是它增加了argv,而argv[1]显然没有。

对于您的错误,您应该更改:

int summer(int *acc, char * ptr[])
{

至:

int summer(int *acc, char * ptr)
{

当您取消引用char **(即argv的类型)时,您将得到一个char *char *atoi()所期望的。

你的程序本质上相当于:

#include <iostream>
#include <cstdlib>
using namespace std;
void summer(int * acc, char * ptr)
{
    *acc += atoi(ptr);
}
int main(int argc, char * argv [])
{
    int sum = 0;
    for ( int i = 1; i < argc; ++i ) {
        summer(&sum, argv[i]);
    }
    cout << "sum is " << sum << endl;
}

只是您的不检查argc的麻烦值。

++被称为增量运算符。它通常在某个事物上加1。

argv衰减到一个指针,该指针指向程序的参数容器。

表达式++argv指向下一个参数(若有)。

增加指针意味着使其指向列表中的下一项。

argv的类型为char **(不要被方括号分散注意力),这意味着它指向相邻char * s列表中的char *argc参数让我们知道在哪里可以找到所述列表的末尾。

因此,执行++argv意味着argv现在将指向列表中的下一个char *。将*应用于此(并将结果传递给函数)意味着我们将列表中下一个char *的值发送给该函数。

所有这些的结果是,除了第一个参数外,每个参数都调用一次函数(因为我们在第一次取消引用之前++'d)。

注:。这段代码实际上有一个错误;如果argc == 0,它将进入拉拉邦。它应该在进入循环之前检查这种情况。

它是恒定的吗?因为我们依赖于命令行中的某些输入,而这些输入无法更改?

否,const char *位指的是atoi()接受的参数类型。它是一个指向常量char的指针。注意,char *可以隐式转换为const char *,但不能相反。

所有这些意味着atoi()接受一个指向字符的指针,并且它承诺不会修改指针的目标。

我的猜测是ptr参数应该是char * ptr而不是char * ptr[]。如果您更改了这一点,代码应该编译。