未初始化的double在第二次调用函数时有值结转(头一个C示例)

未初始化的double在第二次调用函数时有值结转(头一个C示例),c,linux,C,Linux,因此,我在自学编程,并在编写《头先c》一书中的price_Diverss.c程序: 如果前两个输出看起来很好,则自动将total设置为0,但是函数的第三个调用似乎继承了前一个调用的值。我只是好奇为什么会这样 我知道最佳实践可能要求您总是初始化变量,我只是因为懒惰而遇到了这个奇怪的错误。您从堆栈中获得了一些随机值。它可以是任何东西 这不是最佳实践。在使用变量之前,必须初始化变量。或者任何事情都可能发生。您的代码具有未定义的行为。您不能期望它产生任何特定的输出。谢谢,我将确保从现在开始初始化我的变量

因此,我在自学编程,并在编写《头先c》一书中的price_Diverss.c程序:

如果前两个输出看起来很好,则自动将total设置为0,但是函数的第三个调用似乎继承了前一个调用的值。我只是好奇为什么会这样


我知道最佳实践可能要求您总是初始化变量,我只是因为懒惰而遇到了这个奇怪的错误。

您从堆栈中获得了一些随机值。它可以是任何东西


这不是最佳实践。在使用变量之前,必须初始化变量。或者任何事情都可能发生。

您的代码具有未定义的行为。您不能期望它产生任何特定的输出。谢谢,我将确保从现在开始初始化我的变量!谢谢,我会记住的!
#include <stdio.h>
#include <stdarg.h>

enum drink { MUDSLIDE, FUZZY_NAVEL, MONKEY_GLAND, ZOMBIE };

double price(enum drink d){
    switch(d) {
    case MUDSLIDE:
    return 6.79;
    case FUZZY_NAVEL:
    return 5.31;
    case MONKEY_GLAND:
    return 4.82;
    case ZOMBIE:
    return 5.89;
    }
    return 0;
}

double total(int args, ...){
    double total;
    va_list ap;
    va_start(ap, args);
    int i;
    for(i = 0; i < args; i += 1){
        enum drink d = va_arg(ap, enum drink);
        total = total + price(d);
    }
    va_end(ap);
    return total;
}

int main(){

    printf("Price is %.2f\n", total(2, MONKEY_GLAND, MUDSLIDE));
    printf("Price is %.2f\n", total(3, MONKEY_GLAND, MUDSLIDE, FUZZY_NAVEL));
    printf("Price is %.2f\n", total(1, ZOMBIE));

    return 0;
}
$ ./a.out 
Price is 11.61
Price is 16.92
Price is 22.81