【问题标题】:Why (5+10)/2 is 7.0 not 7.5? C programming为什么 (5+10)/2 是 7.0 而不是 7.5? C 编程
【发布时间】:2020-05-20 06:04:21
【问题描述】:

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; 是一个 int 表达式,它产生的 7 被保存为 double。
  • 它正在对15 / 2 = 7 进行整数除法,并且仅然后将其转换为double
  • 如何将其转换为双倍?
  • 把 2.0 换成 2
  • 为此我们需要一个规范的骗子。这是一个非常常见的常见问题解答——每个学习 C 的人都可能遇到这个错误。我们在 C 常见问题解答中有 this,但我认为它不够通用,无法用作此目的的欺骗目标。

标签: c integer double average integer-arithmetic


【解决方案1】:

当您执行(*pi + *pj) / 2 时,您正在执行整数运算。在分配给double 变量之前,小数点后的数字已经被丢弃。

一种方法是(*pi + *pj) / 2.0。表达式的一个操作数是双精度,在计算表达式之前,另一个 ints 将被提升为 doubles。

另一种选择是将typecast 变量之一转换为双重((double)*pi + *pj) / 2。在这里,优先级较高的取消引用运算符将​​在类型转换之前进行评估。

【讨论】:

    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 2018-12-10
    • 2011-05-12
    • 2020-05-18
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    相关资源
    最近更新 更多