++group((int)(value[i])/10);在C语言中是什么意思?

4

这个程序是用来计算学生分数频率的

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.? */
}

它是做什么的?它调用了未定义行为。 - user1804599
@not-rightfold:它有什么未定义的地方? - Claudiu
@ShafikYaghmour:哦,没错。我可能是漏看了或者以为那只是为了显示类型。 - Claudiu
@claudiu,@ShafikYaghmour,我已经编辑了代码,请检查! - syed_sami
3个回答

7

这一行:

++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数组进行索引之前,请检查输入值是否在范围内或组索引是否在范围内。


@ShafikYaghmour: 当然,谢谢提醒。已经修改以反映这一点。 - Claudiu

1
 ++group[(int)(value[i])/10)];  

让我们把这个分开

1. (int)(value[i])/10)

例如,如果value[i]为51,则由于使用了整型强制转换,结果将为5。
2. ++group[5]; // is same as group[5] += 1;

group[5] 进行前置自增操作


-1

在子表达式中

(int)(value[i])/10)

value[i]float 类型的,将其除以 10 会得到一个 double 值(默认提升后)。但是数组下标应该是整数类型,“(int)”用于将子表达式的返回值强制转换为整数类型。
在表达式中

++group[(int)(value[i]) / 10)];   

前缀++用于对数组元素group[(int)(value[i])/10)]进行预增。


2
它是预增量。在你的答案中更改它。顺便说一句,我没有投票反对这个。 - Gangadhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接