对使用数组长度的宏感到困惑
Confusion around using a macro for an array length
下面这段代码简单地读取了 10 个整数并将它们存储在一个长度为 10 的数组中。我有两个问题:
- 在此示例中,使用宏
N ((int)(sizeof(a) / sizeof(a[0])))
或仅表示数组长度的整数(本示例中为 10)有何不同?
- 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 这样的幻数而不是宏会降低程序的灵活性。如果数组中的元素数量将发生变化,您将需要找到所有使用幻数更新它们的地方。
下面这段代码简单地读取了 10 个整数并将它们存储在一个长度为 10 的数组中。我有两个问题:
- 在此示例中,使用宏
N ((int)(sizeof(a) / sizeof(a[0])))
或仅表示数组长度的整数(本示例中为 10)有何不同? - 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 这样的幻数而不是宏会降低程序的灵活性。如果数组中的元素数量将发生变化,您将需要找到所有使用幻数更新它们的地方。