努力学C的阿通 发表于 2023-6-27 22:15:46

c语言数组章节课后题问题

数组章节“动动手”课后题中,题目是“用户输入年份,打印该年每个月的天数”。我对答案中的其中一行代码看不懂。
答案代码是:
#include <stdio.h>

int main()
{
      int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
      int i, year;

      printf("请输入一个年份:");
      scanf("%d", &year);

      if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
      {
                days = 29;
      }

      for (i = 0; i < sizeof(days) / sizeof(days); i++)
      {
                printf("%2d月份:%d天\n", i+1, days);
      }


      return 0;
}


我对其中的 for (i = 0; i < sizeof(days) / sizeof(days); i++)看不太懂,大神们可以给小白解释一下这行代码的意义吗?特别是 i < sizeof(days) / sizeof(days)代表什么呢?在这给大神鞠躬了

isdkz 发表于 2023-6-27 22:24:33

这行代码的含义是从数组的第一个元素开始循环,直到最后一个元素结束。这是一种常见的遍历数组的方式。

先来看 sizeof(days) 。 sizeof 是一个常用的C语言操作符,它可以返回一个对象或者类型所占的内存字节数。在这个代码里, days 是一个整数数组, sizeof(days) 返回的是数组整体所占的内存大小,以字节为单位。

然后是 sizeof(days) , days 表示数组 days 的第一个元素,因为 days 数组的元素是整型(int类型),所以 sizeof(days) 返回的是一个int整型数据所占的内存大小。

sizeof(days) / sizeof(days) 的结果就是数组 days 的元素个数。因为整个数组的大小除以一个元素的大小,自然就是元素的个数。

所以这个 for 循环的意思就是从数组的第一个元素开始,一直循环到最后一个元素。 i 就是数组元素的索引,它的初始值为0,每次循环增加1,直到达到数组的元素个数。

这是一种在C语言中常见的获取数组长度的方式。在其他一些语言中,数组或者集合类型可能有一个.length或者.count属性可以直接得到长度,但是C语言没有这样的特性,所以需要通过这种方式来计算数组的长度。

歌者文明清理员 发表于 2023-6-27 22:45:39

本帖最后由 歌者文明清理员 于 2023-6-27 22:47 编辑

在这段代码中,for 循环使用了 sizeof 运算符来确定数组 days 的长度。了解并正确使用这个表达式对于编写 C 语言程序是很重要的。

sizeof 是 C 语言中的一个运算符,用于计算对象在内存中所占的字节数。它可以用于计算各种数据类型(如整数、浮点数、数组、结构体等)的大小。

sizeof(days) 计算整个数组 days 占用的字节数。在这个例子中,数组 days 的类型是 int,它占用4个字节(32位系统)或者8个字节(64位系统),因此 sizeof(days) 返回的是整个数组占用的字节数。

而 sizeof(days) 则计算数组中第一个元素的大小。由于数组 days 中的元素类型也是 int,所以 sizeof(days) 返回的是一个整数的字节数。

通过将数组的总字节数除以第一个元素的字节数,我们可以得到数组的长度(即元素的个数)。这样做的原因是 C 语言中没有内建的方式来获取数组的长度,我们需要使用这种技巧来确保循环在正确的范围内执行。

在 for 循环的条件中,i 表示循环变量,它从 0 开始递增,当 i 小于数组 days 的长度时,循环继续执行。这样就保证了循环会遍历整个数组,并打印出每个月份和对应的天数。

希望通过这个解释,您能更好地理解代码中 for 循环的条件部分。如果还有其他问题,请随时问我。我会尽力帮助您!

sfqxx 发表于 2023-6-27 22:53:55

在这行代码中,sizeof(days) 表示数组 days 的字节数,sizeof(days) 表示数组中每个元素的字节数。通过将总字节数除以每个元素的字节数,我们可以得到数组的长度(也就是数组元素的个数)。

仍旧是 i < sizeof(days) / sizeof(days) 表达式的含义是,只要变量 i 的值小于数组 days 的长度,循环就会继续进行。这样做是为了确保循环能够遍历整个数组,并打印出每个月的天数。

以这个具体的例子来说,数组 days 中有12个元素,而每个元素占用的字节数为4(int类型的字节数通常为4)。所以 sizeof(days) 将返回 12 * 4 = 48 字节,sizeof(days) 将返回 4 字节。因此,sizeof(days) / sizeof(days) 将等于 48 / 4 = 12,表示数组 days 的长度为12。

这段循环代码将 i 的值从 0 逐渐增加到数组长度减1的范围内,即 0 到 11。这正好对应了数组 days 中的每个元素,所以可以使用 i 来访问并打印出每个月的天数。
页: [1]
查看完整版本: c语言数组章节课后题问题