該程序是用於計算學生標誌着頻率++ group((int)(value [i])/ 10);它有什麼作用..?用C
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);它有什麼作用..?用C
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
數組之前,檢查輸入值是否在界限內或組索引是否在界限內。
@ShafikYaghmour:當然,謝謝。修改以反映這一點。 – Claudiu
在子表達
(int)(value[i])/10)
value[i]
是float
類型的,將其除以10
會給double
值(後默認的提升)。但數組下標應該是整數類型,(int)
用於將子表達式的返回值轉換爲整數。
在表達
++group[(int)(value[i])/10)];
前綴++
被用於預增量數組元素group[(int)(value[i])/10)]
。
它是pre increment.change它在你的answer.btw我沒有投下了這個。 – Gangadhar
++group[(int)(value[i])/10)];
讓分這
1. (int)(value[i])/10)
例如值[i]是51,作爲使用的是鑄造爲int會造成5。的group[5]
預遞增價值是什麼呢?它調用UB。 – rightfold
@沒有rightfold:關於它的未定義? – Claudiu
@ShafikYaghmour:哦,真的。我或者錯過了那個,或者假設那只是爲了顯示 – Claudiu