C变量参数

问题描述:

我有这样的功课:“使用具有可变数量参数的函数从字符串(隐式值或来自KB)确定10个精度双数的最小值。前7个值将被考虑最初,接下来是最后3点,最后是这2点。“那么我做到了这一切,但我不知道为什么它给了我一些奇怪的结果。下面的代码:C变量参数

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <stdlib.h> 
#include <stdarg.h> 
#include <conio.h> 
double min(double,...); 

void main(){ 
    double a,b,c; 
    printf("Introduceti numerele: "); 
    scanf("%lf%lf%lf",&a,&b,&c); 
    printf("\nMinimul este %lf",min(10,1.34,4.34,7,5.23,6.23,2,8.232,a,b,c)); 
    _getch(); 
} 

double min(double x,...){ 
    int i; 
    double y; 
    va_list ap; 
    va_start(ap,x); 
    y=va_arg(ap,double); 
    for(i=0;i<x;i++){ 
     if(y>va_arg(ap,double)) 
      y=va_arg(ap,double); 
    } 
    va_end(ap); 
    return y; 
} 

此外,我不知道为什么编译器知道什么论据是下一个,因为我没有在使用的va_arg(AP,双)。

for(i=0;i<x;i++){ 
    if(y>va_arg(ap,double)) 
     y=va_arg(ap,double); 
+6

什么是奇怪的结果(除了唐纳德特朗普离开理发师时)? –

+0

'_getch'和'conio'不是标准的。 – Olaf

+0

嗯,我得到这样的:-93453434343 –

在调用你的函数min第一个参数是参数的个数,它具有类型int

#include <stdarg.h> 

double min(int numberOfArgs, ...) 
     // ^^^ 
{ 
    va_list argptr; 
    va_start(argptr, numberOfArgs);   // initialize argument pointer 

    double minData = va_arg(argptr, double); // initialize the minimum with the first argument 
               // and increment argument pointer 
    for (int i = 1; i < numberOfArgs; i ++) // for all of the following arguments 
    { 
     double data = va_arg(argptr, double); // get argument and increment argument pointer 
     if (data < minData)     // test if argument is less than mnimum 
      minData = data; 
    } 
    va_end(argptr); 

    return minData; 
} 

确保所有的参数列表你的论点是浮点double

int main() 
{ 
    double a, b, c; 
    printf("Introduceti numerele: "); 
    scanf_s("%lf%lf%lf", &a, &b, &c); 

    double minVal = min(10, 1.34, 4.34, 7.0, 5.23, 6.23, 2.0, 8.232, a, b, c) 
             // ^^    ^^  
    printf("\nMinimul este %lf", minVal); 
    return 0; 
} 
+0

你可以通过坚持一个'双参数:'双分钟(int numargs,double v1,...)'。这可以防止你用0个实际的浮点参数调用它(但并不妨碍你用参数数目0调用它,甚至是否定的 - 但C不是用于白痴的语言)。这意味着你只能在循环体中使用'va_arg()'。 –