1

可変数の引数を持つ関数を使用するプログラムを作成しようとしています。追加のタスクは、すべての関数呼び出しのすべての引数を個別に出力することです。コードは次のとおりです。

#include<stdio.h>
#include<stdarg.h>
#include<string.h>
int mul(int x,...);
int main()
{
int a=1,b=2,c=3,d=4,x;
printf("The product of %d is :%d\n",a,mul(1,a));
printf("The product of %d, %d is :%d\n",a,b,mul(2,a,b));
printf("The product of %d, %d, %d is :%d\n",a,b,c,mul(3,a,b,c));
printf("The product of %d, %d, %d, %d is :%d\n",a,b,c,d,mul(4,a,b,c,d));
return 0;
}
int mul(int x,...)
{
    int i,prod=1;
    va_list arglist;
    va_start(arglist, x);
    for(i=0;i<x;i++)
    {   
        prod*=va_arg(arglist,int);
    }
    printf("\n");
    for(i=0;i<x;i++)
    {   
        printf("The argument is %d\n",va_arg(arglist,int));
    }
    va_end(arglist);
    return prod;
}

このプログラムの出力は次のとおりです。

上記プログラムの出力

コードの他の部分は次のとおりです。

#include<stdio.h>
#include<stdarg.h>
#include<string.h>
int mul(int x,...);
int main()
{
int a=1,b=2,c=3,d=4,x;
printf("The product of %d is :%d\n",a,mul(1,a));
printf("The product of %d, %d is :%d\n",a,b,mul(2,a,b));
printf("The product of %d, %d, %d is :%d\n",a,b,c,mul(3,a,b,c));
printf("The product of %d, %d, %d, %d is :%d\n",a,b,c,d,mul(4,a,b,c,d));
return 0;
}
int mul(int x,...)
{
    int i,prod=1;
    va_list arglist;
    va_start(arglist, x);
    for(i=0;i<x;i++)
    {   
        prod*=va_arg(arglist,int);
    }
    printf("\n");
    va_end(arglist);
    va_start(arglist,x);
    for(i=0;i<x;i++)
    {   
        printf("The argument is %d\n",va_arg(arglist,int));
    }
    va_end(arglist);
    return prod;
}

出力は次のとおりです。

2 番目の出力

この違いはなぜですか?何か助けはありますか?

4

2 に答える 2

2

最初の例では、次の 2 行が欠落しています。

va_end(arglist);
va_start(arglist,x);

これは、乗算を行った後、パラメーターの末尾を超えて読み取っていることを意味します。表示される値は、たまたまスタックにあったものです。

于 2013-01-18T14:51:55.100 に答える
0

va_arg(va_list ap, type) は、引数リストの次の引数を取得します。そのため、最初のコードでは、1 回のループ後に引数を消費しています。2番目のコードの代わりに、引数を出力し、単一のループで乗算を維持する次のコードを使用できます

int mul(int x,...)

{
    int i,m,prod=1;
    enter code here
    va_list arglist;
    enter code here
    va_start(arglist, x);
    for(i=0;i<x;i++)
    {   
        m=va_arg(arglist,int);
        prod*=m
        printf("The argument is %d\n",m);
    }
    printf("\n");

    return prod;
}
于 2013-01-18T15:18:30.160 に答える