为什么 (5+10)/2 是 7.0 而不是 7.5? C编程
Why (5+10)/2 is 7.0 not 7.5? C programming
c 代码:
int main(void) {
int i = 0, j = 0;
double avg = 0;
int *pi, *pj;
double *pavg;
..
pi = &i;
pj = &j;
pavg = &avg;
..
*pi = 5;
*pj = 10;
*pavg = (*pi + *pj) / 2;
这里打印的地方:
printf("%lf\n\n", avg);
它打印 7.000000000
return 0;
}
当您执行 (*pi + *pj) / 2
时,您正在执行整数运算。在您分配给 double
变量之前,小数点后的数字已被丢弃。
一种方法是 (*pi + *pj) / 2.0
。表达式的操作数之一是双精度数,其他 int
s 将在计算表达式之前提升为 double
s。
另一种选择是 typecast 将其中一个变量设为双 ((double)*pi + *pj) / 2
。在这里,优先级较高的取消引用运算符将在类型转换之前进行评估。
c 代码:
int main(void) {
int i = 0, j = 0;
double avg = 0;
int *pi, *pj;
double *pavg;
..
pi = &i;
pj = &j;
pavg = &avg;
..
*pi = 5;
*pj = 10;
*pavg = (*pi + *pj) / 2;
这里打印的地方:
printf("%lf\n\n", avg);
它打印 7.000000000
return 0;
}
当您执行 (*pi + *pj) / 2
时,您正在执行整数运算。在您分配给 double
变量之前,小数点后的数字已被丢弃。
一种方法是 (*pi + *pj) / 2.0
。表达式的操作数之一是双精度数,其他 int
s 将在计算表达式之前提升为 double
s。
另一种选择是 typecast 将其中一个变量设为双 ((double)*pi + *pj) / 2
。在这里,优先级较高的取消引用运算符将在类型转换之前进行评估。