我想知道我是否使用了正确的变量类型。据我所知,我应该只使用花车和整体。我知道它打印“除以4”部分,因为在功能中我将其切换为5并打印“5.0000”。如果我将“结果”设为int,它显然会删除小数点的答案,但它仍然给出正确的平均值而不是“4”。 为什么在结果变量中存储“4.0000”而不是答案?
void main(void)
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
// stop watchdog timer\
srand(time(NULL));
int val1 = (rand()%100);
int val2 = (rand()%100);
int val3 = (rand()%100);
int val4 = (rand()%100);
printf("%d\n",val1);
printf("%d\n",val2);
printf("%d\n",val3);
printf("%d\n",val4);
printf("%f\n",average4(val1, val2, val3, val4));
}
float average4(int val1, int val2, int val3, int val4){
float result;
result = (val1 + val2 + val3 + val4)/4;
return result;
}
答案 0 :(得分:1)
两个问题:
(val1 + val2 + val3 + val4)/4;
在整数算术中计算,因为这些术语是整数类型。剩下的就丢弃了。
一种解决方法是撰写1.f * (val1 + val2 + val3 + val4) / 4;
或稍微混淆0.25f * (val1 + val2 + val3 + val4);
您错过了average4
的原型。正式地,执行该操作的行为是 undefined (因为包括C99),您可能正在观察在调用站点转换为int
。
答案 1 :(得分:1)
以下提议的代码:
WDT_A
WDT_A_CTL_HOLD
和WDT_A_CTL_PW
未被声明,因此现在提出的代码,带有评论
#include <stdio.h> // printf()
#include <stdlib.h> // rand(), srand()
#include <time.h> // time()
// prototypes
float average4(int val1, int val2, int val3, int val4);
int main(void) // corrected signature
{
WDT_A->CTL = WDT_A_CTL_PW | WDT_A_CTL_HOLD;
// stop watchdog timer // removed trailing line continuation 'slash'
srand( (unsigned int)time(NULL)); // cast to expected type
int val1 = (rand()%100);
int val2 = (rand()%100);
int val3 = (rand()%100);
int val4 = (rand()%100);
printf("%d\n",val1);
printf("%d\n",val2);
printf("%d\n",val3);
printf("%d\n",val4);
printf("%f\n",average4(val1, val2, val3, val4));
}
float average4(int val1, int val2, int val3, int val4)
{
float result;
// cast the 'integer' sum to 'float',
// properly declared the '4' as a 'float' literal
// so division is 'float' rather than `'integer' division
result = (float)(val1 + val2 + val3 + val4)/4.0f;
return result;
}
进行测试时,我注释掉试图弄乱看门狗定时器的那一行。
我使用gcc
运行上面的代码来编译/链接然后在我的ubuntu linux系统上打开一个终端,这里有几个典型的执行。
32
13
74
29
37.000000
和
77
53
90
49
67.250000