变量参数列表程序行为异常-csdarg
variable argument list program behaving strangely - cstdarg
这个程序只给出一次正确的结果。我一直在尝试了解如何使用cstaarg中的宏来创建和调用具有可变数量分段的函数。
#include <iostream>
#include <cstdarg>
using std::cout;
using std::endl;
int sum(int count, ...)
{
if(count <= 0)
return 0;
va_list myarg_ptr; //create pointer to argument list
va_start(myarg_ptr, count); // initate pointer to argument list
int sum(0);
for(int i=0; i<count; i++)
sum += va_arg(myarg_ptr, int); // use and increment pointer to arugment list
va_end(myarg_ptr); // set argument list pointer to NULL
return sum;
}
int main(int argc, char* argv[])
{
cout << sum(9, 11, 22, 33, 44, 55, 66, 77, 6) << endl;
cout << sum(6, 2, 4, 6, 8, 10, 5) << endl;
cout << sum(9, 1, 2) << endl;
std::system("pause");
return 0;
}
我得到的输出是:
273156986
35
-173256537
Press any key to continue...
修复sum()调用,求和的元素数应该是sum()的第一个参数
所以,
cout << sum(8, 11, 22, 33, 44, 55, 66, 77, 6) << endl; //8 arguments
cout << sum(6, 2, 4, 6, 8, 10, 5) << endl; // 6 arguments
cout << sum(2, 1, 2) << endl; //2 arguments
sum()
的第一个参数是以下(变量)参数的数量。第一次和第三次调用的函数值都不正确。
您想要:
cout << sum(8, 11, 22, 33, 44, 55, 66, 77, 6) << endl;
cout << sum(6, 2, 4, 6, 8, 10, 5) << endl;
cout << sum(2, 1, 2) << endl;
您在portotype中明确提到的第一个参数是参数的一部分!如果你想把计数传递给你的函数,你需要自己明确地传递它,例如,最后一个调用应该是这样的:
std::cout << sum(3, 9, 1, 2) << 'n';
(您也应该停止过度使用std::endl
)。
一个可能更可取的C++2011方法可能是使用一个适当的可变参数列表:
template <typename T>
int sum(T value) { return value; }
template <typename T, typename... S>
int sum(T value, S... values) { return value + sum(values...); }
可变参数列表可以正确检测参数的数量。当使用变量参数列表时,您需要使检测到的参数列表完全正确,这有时不是完全琐碎的。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是什么导致了Unity 3D中的"错误线程异常"?
- 如何将strftime中的格式错误作为异常捕获
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 尝试使用智能指针时引发异常
- 函数如何通知用户它基于函数原型抛出异常?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 变量参数列表程序行为异常-csdarg