这个程序是用来计算学生分数频率的
float value[50];
int group[11] = {0};
for (i = 0; i < 50; i++) {
scanf("%f",&value[i]); /* reading of values */
++group[(int)(value[i])/10)]; /* what does this line do.? */
}
这个程序是用来计算学生分数频率的
float value[50];
int group[11] = {0};
for (i = 0; i < 50; i++) {
scanf("%f",&value[i]); /* reading of values */
++group[(int)(value[i])/10)]; /* what does this line do.? */
}
这一行:
++group[(int)(value[i]) / 10)];
等同于:
int flooredValue = (int)value[i]; //e.g. 3.5 becomes 3; 12.6 becomes 12
int groupIndex = flooredValue / 10; //division discarding the remainder
group[groupIndex] += 1;
不过这意味着什么呢?下面是它如何将值转换的:
value[i] | groupIndex
----------+------------
3.5 | 0
12.6 | 1
18.6 | 1
23.1 | 2
57 | 5
94.6 | 9
100 | 10
因此,它最终会计算每个10个标记的桶中有多少个标记。得分从0到9.9999落在“0”桶中,从10到19.99999落在“1”桶中,依此类推。但请注意以下内容:
value[i] | groupIndex
-----------+------------
-3.5 | -3
155.6 | 15
现在,你输入的值可能小于零或大于100。如果发生这种情况,你将写入超出group
边界的内存。这将导致非常不愉快的行为。在对group
数组进行索引之前,请检查输入值是否在范围内或组索引是否在范围内。
++group[(int)(value[i])/10)];
让我们把这个分开
1. (int)(value[i])/10)
2. ++group[5]; // is same as group[5] += 1;
对 group[5]
进行前置自增操作
在子表达式中
(int)(value[i])/10)
value[i]
是 float
类型的,将其除以 10
会得到一个 double
值(默认提升后)。但是数组下标应该是整数类型,“(int)”用于将子表达式的返回值强制转换为整数类型。
在表达式中
++group[(int)(value[i]) / 10)];
前缀++
用于对数组元素group[(int)(value[i])/10)]
进行预增。