什么是++argv?&令人困惑的编译器错误
What is ++argv? & confusing compiler error
这段代码是我的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中更改的和中。这是我真正理解的代码中唯一的一部分。对不起,如果我的问题/这篇文章有点乱。
总结一下我的问题:
- 编译错误消息是什么意思
- ++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[]
。如果您更改了这一点,代码应该编译。
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++,我收到一个无法理解的编译器错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 重载方法的方式会在使用临时调用时生成编译器错误
- 尝试使用继承和模板实现CRTP.Visual Studio正在生成编译器错误
- 编译器错误:destuctor 的更宽松的抛出说明符
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- C++ G++ 编译器 - 错误:隐式声明的定义
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 模板模板参数和模板别名:编译器错误?
- C++ 编译器错误:P1LinkedList.cpp:145:错误:重载的"to_string(int&)"调用不明确
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- C1001内部编译器错误是由于矢量初始化(如数组)引起的
- 编译器错误(英特尔并行工作室 2019 与 Visual Studio 社区 2019)
- 如何在C++中克服此 C4430 编译器错误?
- 尝试使用 WinBGI 显示文本时出现编译器错误
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440
- C++自定义分配器大小参数作为模板参数会引发编译器错误