该程序用于计算学生的分数频率
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)
例如 value[i] 为 51,当您使用转换为 int 时,它将产生 5。
2. ++group[5]; // is same as group[5] += 1;
的预递增值group[5]
在子表达式中
(int)(value[i])/10)
value[i]
是 type float
,将其除以10
将给出double
值(在默认提升之后)。但是数组下标应该是整数类型,(int)
用于将子表达式的返回值强制转换为整数。
在表达
++group[(int)(value[i]) / 10)];
前缀++
用于预递增数组元素group[(int)(value[i])/10)]
。