该程序只给出一次正确的结果。我一直试图了解cstadarg中的宏如何用于创建和调用具有可变数量的arugments的函数。
#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...
答案 0 :(得分:1)
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;
答案 1 :(得分:1)
修复你的sum()调用,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
答案 2 :(得分:0)
你在portotype中明确提到的第一个参数是参数的一部分!如果您希望将计数传递给您,您需要自己明确地传递它,例如,最后一次调用应该如下所示:
std::cout << sum(3, 9, 1, 2) << '\n';
(你也应该stop excessive use of 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...); }
可变参数列表可以正确检测参数的数量。使用变量参数列表时,您需要完全正确地获取检测到的参数列表,这有时并非完全无关紧要。