C Day 19

让长度跟随数组,
让平均值保留小数

今天从数组占用的空间出发,计算元素数量,再把长度用进循环,最后学习浮点平均值和输出格式的区别。

sizeof 测量字节,不是数元素

sizeof(values) 得到整个数组占用的字节数,sizeof(values[0]) 得到一个元素的字节数。两者相除,才得到数组包含多少个元素。

day19.c
int values[5] = {2, 4, 6, 8, 10};
size_t count = sizeof(values) / sizeof(values[0]);
printf("数组元素数量 = %zu\n", count);

最初把字节数误当成元素数量。订正后用实际运行确认:当前环境中一个 int 占 4 字节,五个元素的数组占 20 字节,20 ÷ 4 得到 5。

我还询问了如何知道不同环境中的 int 大小:可以使用 sizeof(int) 确认,不必猜测,也不能把“64 位环境”直接理解成 int 一定占 8 字节。这里的长度公式用于实际数组,不能直接照搬到以后学习的指针或函数参数上。

让循环使用计算出的长度

sizeof 的结果类型是 size_t,输出时配合 %zu。用 size_t 保存 count 和下标,再让条件写成 index < count,就不必在多个地方手写相同长度。

修改数组长度并重新编译运行后,count 会按新数组大小计算。最终练习把五个元素改成六个元素,循环条件保持不变,仍然正确访问了下标 0—5。

浮点转换必须发生在除法之前

double result = 9 / 4; 的右侧先做整数除法,得到 2,再保存为 2.0。左边用了 double,并不会让右边自动变成浮点除法。

写成 double result = (double)9 / 4;,才会先转换再相除,得到 2.25。同样,平均值使用 (double)total / count;这个转换并不会改变原变量 total 的 int 类型。

计算值与显示格式是两件事

%.2f 控制显示小数点后两位,不改变变量本身。6.2 会显示成 6.20;变量保存 2.375 时,使用 %.2f 显示 2.38 后,仍可用 %.3f 显示 2.375。

本日多次在预测中漏写末尾的 0,也一度认为格式会修改变量。通过补答重新区分:计算决定数值,格式决定显示;4.5 用 %.2f 显示为 4.50,但值没有因此变化。

最终代码:六个负数的平均值

day19.c · 核心代码
int values[6] = {-2, -4, -6, -8, -10, -3};
size_t count = sizeof(values) / sizeof(values[0]);
int total = 0;

for (size_t index = 0; index < count; index++)
{
    total = total + values[index];
    printf("下标 %zu,数据 = %d\n", index, values[index]);
}

printf("总和 = %d\n", total);
double average = (double)total / count;
printf("平均值 = %.2f\n", average);

三组实际运行结果

  • 2、4、6、8、10:数量 5,总和 30,平均值 6.00
  • 2、4、6、8、11:数量 5,总和 31,平均值 6.20
  • -2、-4、-6、-8、-10、-3:数量 6,总和 -33,平均值 -5.50

前两组数组占 20 字节,最后一组占 24 字节,单个元素均为 4 字节。三组运行都正常退出,代码为 0。

需要继续巩固的地方

除了字节数和显示格式,预测时还漏看过循环外的总和输出;计算平均值时,曾把 31 ÷ 5 误算为 5.2,把 9 ÷ 4 的浮点结果误算为 2.50。这些已逐项订正,但仍需要继续用短题巩固,不能只凭程序运行正确就认为所有概念都已稳固。

下一课先短暂复习长度与输出格式,再学习数组线性查找和目标值出现次数统计。