1

这个程序只给出一次正确的结果。我一直试图了解如何使用 cstadarg 中的宏来创建和调用具有可变数量参数的函数。

#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...
4

3 回答 3

1

修复你的 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
于 2013-07-26T15:03:49.613 回答
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;
于 2013-07-26T15:03:39.440 回答
0

您在 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...); }

可变参数列表可以正确检测参数的数量。使用可变参数列表时,您需要完全正确地获取检测到的参数列表,这有时并不完全是微不足道的。

于 2013-07-26T15:07:20.830 回答