数组元素求和:sum3方法为何失效?为何需强制转换double类型?
问题代码
#include <stdio.h> int main() { double a[3] = {1.,3.,5.}; double sum1 = a[0]+a[1]+a[2]; int i=0; double sum2 = (double)a[i]+(double)a[i+1]+(double)a[i+2]; double sum3 = a[i]+a[i+i]+a[i+2]; printf("sum1=%f sum2=%f sum3=%f\n",sum1, sum2, sum3); }
运行结果
sum1=9.000000 sum2=9.000000 sum3=7.000000
解答
1. sum3失效的原因
这是典型的笔误问题:你把a[i+1]写成了a[i+i]。
此时变量i的值是0,i+i的计算结果是0+0=0,所以a[i+i]等价于a[0],而非你预期的a[1]。实际计算过程是:
a[i]=a[0]= 1.0a[i+i]=a[0]= 1.0a[i+2]=a[2]=5.0
三者相加就是1.0+1.0+5.0=7.0,和你看到的结果完全吻合。只要把a[i+i]改成a[i+1],sum3的结果就会和sum1、sum2一致。
2. sum2里的强制转换完全多余
数组a的类型是double[],所以数组中的每个元素本身就是double类型。当你通过a[i]、a[i+1]访问元素时,得到的结果天然是double类型,根本不需要用(double)进行强制转换。sum2里的强制转换属于无意义的冗余操作,删掉后代码功能和结果都不会受影响。
内容的提问来源于stack exchange,提问作者rkg125
相关产品推荐
相关产品推荐

