对使用数组长度的宏感到困惑

Confusion around using a macro for an array length

下面这段代码简单地读取了 10 个整数并将它们存储在一个长度为 10 的数组中。我有两个问题:

  1. 在此示例中,使用宏 N ((int)(sizeof(a) / sizeof(a[0]))) 或仅表示数组长度的整数(本示例中为 10)有何不同?
  2. a[0]不是在初始化之前被sizeof()调用的吗?

如有任何帮助,我们将不胜感激。

#include <stdio.h>

#define N ((int)(sizeof(a) / sizeof(a[0])))

int main(void)
{
    int a[10], i;

    printf("\nEnter %d numbers ", N);
    for (i = 0; i < N; i++)
        scanf("%d", &a[i]);

    return 0;
}

使用转换为 int 类型是个坏主意。写

就够了
#define N (sizeof(a) / sizeof(a[0]))

a[0]的值未被使用。 sizeof 运算符确定操作数的类型,然后确定该类型对象的大小。

注意sizeof不是函数。它是一个操作员。你也可以写

#define N (sizeof a / sizeof a[0] )

使用像 10 这样的幻数而不是宏会降低程序的灵活性。如果数组中的元素数量将发生变化,您将需要找到所有使用幻数更新它们的地方。