将int更改为double会将结果更改为零

时间:2012-10-23 03:59:57

标签: c

如果我将所有变量保留为int我得到32.该除法应该给我32.5所以我认为将所有内容改为double会做到这一点,但它只是给我零...

这是代码(int中的所有内容):

#include <stdio.h>
#include <stdlib.h>

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average);

int main(int argc, char *argv[])
{
    int tableau[4] = {30, 50, 50};
    int *x = 0;
    int *average = 0;
    const int tailleTab = 4;

    sommeTableau(tableau, tailleTab, &x, &average);

    printf("The average is %d\n", average);

    return 0;
}

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average)
{
  int i = 0;

  for (i = 0 ; i < tailleTableau ; i++)
  {
  *x = *x + tableau[i];
  }
  *average = *x/tailleTableau;

}

所以这个工作并且给了我32 ...现在,如果我在printf函数中将所有内容更改为double并将%d更改为%f,则它给出零并且我不明白为什么...

6 个答案:

答案 0 :(得分:3)

您的代码中存在许多错误。我纠正了所有这些

#include <stdio.h>
#include <stdlib.h>

void sommeTableau(int tableau[], int tailleTableau, int *x, double *average);

int main(int argc, char *argv[])
{
    int tableau[4] = {30, 50, 50};
    int x = 0;
    double average = 0;
    const int tailleTab = 4;

    sommeTableau(tableau, tailleTab, &x, &average);

    printf("The average is %lf\n", average);

    return 0;
}

void sommeTableau(int tableau[], int tailleTableau, int *x, double *average)
{
  int i = 0;

  for (i = 0 ; i < tailleTableau ; i++)
  {
  *x = *x + tableau[i];
  }
  *average = (double)(*x)/(double)tailleTableau;

}

答案 1 :(得分:2)

你的一个问题在于:

int *x = 0;
int *average = 0;

sommeTableau(tableau, tailleTab, &x, &average);

前两行应该是:

int x = 0;
int average = 0;

这可以从你应该得到的警告中看出来,假设你正在使用一个不错的编译器:

qq.c: In function ‘main’:
qq.c:13: warning: passing argument 3 of ‘sommeTableau’ from incompatible pointer type
qq.c:4: note: expected ‘int *’ but argument is of type ‘int **’
qq.c:13: warning: passing argument 4 of ‘sommeTableau’ from incompatible pointer type
qq.c:4: note: expected ‘int *’ but argument is of type ‘int **’

此外,您不需要_everything是double,只需要平均值,因此您应该只更改该变量的类型并将其与传递给函数的参数相匹配。

在进行除法之前,还需要将总*x转换为双精度,这样它就知道你不是指整数除法。

通过这些更改,输出将从:

更改
The average is 4.000000

(对我而言)正确:

The average is 32.500000

有关更多详细信息,请参阅以下程序:

#include <stdio.h>
#include <stdlib.h>

void sommeTableau(int tableau[], int tailleTableau, int *x, double *average) {
    int i;
    for (i = 0 ; i < tailleTableau ; i++)
        *x = *x + tableau[i];
    *average = ((double)(*x))/tailleTableau;
}

int main (void) {
    int tableau[4] = {30, 50, 50};
    int x = 0;
    double average = 0;
    const int tailleTab = 4;

    sommeTableau(tableau, tailleTab, &x, &average);
    printf("The average is %lf\n", average);

    return 0;
}

答案 2 :(得分:2)

您将x和average作为空指针传递。这就是你的代码给出分段错误的原因。

根据您的描述,请查看(http://codepad.org/z8fVUTe5)。

#include <stdio.h>
#include <stdlib.h>

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average);

int main(int argc, char *argv[])
{
    int tableau[4] = {30, 50, 50};
    int x = 0;
    int average = 0;
    const int tailleTab = 4;

    sommeTableau(tableau, tailleTab, &x, &average);

    printf("The average is %d\n", average);

    return 0;
}

void sommeTableau(int tableau[], int tailleTableau, int *x, int *average)
{
  int i = 0;

  for (i = 0 ; i < tailleTableau ; i++)
  {
  *x = *x + tableau[i];
  }
  *average = *x/tailleTableau;

}

输出: -

  

平均值为32

答案 3 :(得分:1)

这里有些严重错误 - 您将xaverage定义为main中的指针变量,如果您幸运的话,其大小与{{1}相同},但可能导致未定义的行为。

int中的*x的本地变量声明中删除average,它实际上可以正常工作。

此外,在main中,除法(sommeTableau*x)的两个操作数均为tailleTableau,因此执行整数除法,并在赋值之前丢弃余数int

答案 4 :(得分:1)

int *x = 0;
int *average = 0;

这是定义两个指针并将指针设置为零 - 这在指针上下文中转换为空指针。所以,你必须指向什么。

sommeTableau(tableau, tailleTab, &x, &average);

在这里,您将这些指针的地址传递给该函数,因此该函数实际上正在接收int **

printf("The average is %d\n", average);

然后获取指针的值 - 它所持有的地址 - 并且(可能)将该位模式视为int。这是技术上未定义的行为,但在许多机器上,指针足够像int一样,似乎可以工作。使用浮点数时,几乎永远不会为真。

您要在此处执行的操作是定义两个int s(或两个double s)并将其地址传递给您的函数:

double x=0.0, average=0.0;

sommeTableau(tableau, tailleTab, &x, &average);

// ...
printf("%f, %f\n", x, average);

答案 5 :(得分:1)

它实际上不起作用。

在此,您将xaverage定义为NULL的{​​{1}}指针:

int

而不是指向int *x = 0; int *average = 0; 的指针,而是指向指向int的指针:

int

这显然是错误的。您应该启用编译器警告以查看这些有问题的位置并进行更正。

这里的修正是:

sommeTableau(tableau, tailleTab, &x, &average);

现在,在这里:

int x = 0;
int average = 0;

由于printf("The average is %d\n", average); ,你向printf()谎言int%d,但实际上它是指向int 1}}。上述修正解决了这个问题。如果你对某些参数的类型撒谎printf(),任何事情都可能发生。如果您的编译器是gcc并且启用了警告,那么您也可以发现这类问题。