可変長引数


printfとかで使われてるあれ。
「...」ってかわいいですね。

#include <stdio.h>
#include <stdarg.h>

void print_args(int nnum, ...);

int main()
{
    print_args(5, 1, 2, 3, 4, 5); 
    return 0;
}

void print_args(int nnum, ...)
{
    int i = 0, tmp;
    va_list arg;
    va_start(arg, nnum);
    for (i = 0; i < nnum; ++i) {
        printf("%d\n", va_arg(arg, int));
    }   
    va_end(arg);
}

va_startの第二引数には、可変長になる直前の最後のパラメータをわたす。多分、どこからが可変長引数への引数なのか知りたいんじゃろう。
最低1つの固定引数が必要らしい。したがって以下のような書き方はできない。

void print_args(...);


それと、フォーマットもちゃんと判定してあげないとね。(上ではさぼりまくりでintしか見てないけど)


ああ、ちなみに今更PHPの話するのもなんだけど、PHPなら楽だよね。

<?php
// stdargs.php

function print_avg()
{
    echo array_sum(func_get_args())/count(func_get_args());
}

print_avg(1, 2, 3, 4, 5); // 3.5


JavaScriptでも楽。

function average()
{
  var sum = 0;
  for (var i = 0; i < arguments.length; ++i) {
    sum += arguments[i];
  }      
  return sum/arguments.length;
}

console.info(average(1, 2, 3, 4, 5));

つうかLLではこんなの楽じゃなくてどうするって話か。