应该使用什么类型来遍历数组?
What type should be used to loop through an array?
让我们有这个数组:
char arr[SIZE_MAX];
我想遍历它(并且经过它的最后一个元素):
char *x;
for (i = 0; i <= sizeof(arr); i++)
x = &arr[i];
(编辑以添加一些带指针的有效代码)。
最适合 i
的类型是什么?
我接受非标准类型,例如 POSIX 的类型。
相关问题:
在这种情况下,size_t
是您的朋友。它保证您可以访问任何数组索引。
嗯,有趣的案例。您希望能够循环,让我们假设将其称为最大可能的数字,从而环绕而不是将比较 return 设为 false。这样的事情可能会成功:
char arr[SIZE_MAX];
size_t i = 0;
do {
/* whatever you wanna do here */
++i;
}
while (i <= sizeof(arr) && i != 0);
因为 do-while 将始终执行第一次迭代,我们可以设置一个条件,使循环在 i == 0
时结束,并且它只会在回绕到 0 时发生,而不是在第一次迭代。为 i <= sizeof(arr)
添加另一个条件以处理我们没有环绕的情况。
Let's have this array:
char arr[SIZE_MAX];
请注意,许多 C 实现会拒绝这一点,SIZE_MAX
比它们实际支持的任何数组都大。 SIZE_MAX
是类型 size_t
的最大值,但这与对象的(依赖于实现的)最大大小不同。
And I want to loop through it (and one past its last element):
for (i = 0; i <= sizeof(arr); i++)
What is the most adequate type for i?
没有没有类型可用,我们可以确信能够表示SIZE_MAX + 1
,假设arr
确实有大小[=13] =],您需要 i
的类型才能表示该值以避免无限循环。除非你想要无限循环,这是可能的,尽管不太可能。
另一方面,如果我们有
char arr[NOT_SURE_HOW_LARGE_BUT_LESS_THAN_SIZE_MAX];
那么 i
的适当类型是 size_t
。这是 sizeof
运算符的结果类型,如果我们所做的唯一假设是对象的大小小于 SIZE_MAX
那么 size_t
是我们唯一可以有信心会达到目的。
如果我们可以假设对象的大小有更严格的界限,那么选择不同的类型可能会更有利。特别是,如果我们可以确信它小于 UINT_MAX
,那么 unsigned int
可能是一个性能稍高的选择。当然,有符号类型也可以用于 i
,前提是它们实际上可以表示所有需要的值,但这可能会引起某些编译器的警告。
让我们有这个数组:
char arr[SIZE_MAX];
我想遍历它(并且经过它的最后一个元素):
char *x;
for (i = 0; i <= sizeof(arr); i++)
x = &arr[i];
(编辑以添加一些带指针的有效代码)。
最适合 i
的类型是什么?
我接受非标准类型,例如 POSIX 的类型。
相关问题:
size_t
是您的朋友。它保证您可以访问任何数组索引。
嗯,有趣的案例。您希望能够循环,让我们假设将其称为最大可能的数字,从而环绕而不是将比较 return 设为 false。这样的事情可能会成功:
char arr[SIZE_MAX];
size_t i = 0;
do {
/* whatever you wanna do here */
++i;
}
while (i <= sizeof(arr) && i != 0);
因为 do-while 将始终执行第一次迭代,我们可以设置一个条件,使循环在 i == 0
时结束,并且它只会在回绕到 0 时发生,而不是在第一次迭代。为 i <= sizeof(arr)
添加另一个条件以处理我们没有环绕的情况。
Let's have this array:
char arr[SIZE_MAX];
请注意,许多 C 实现会拒绝这一点,SIZE_MAX
比它们实际支持的任何数组都大。 SIZE_MAX
是类型 size_t
的最大值,但这与对象的(依赖于实现的)最大大小不同。
And I want to loop through it (and one past its last element):
for (i = 0; i <= sizeof(arr); i++)
What is the most adequate type for i?
没有没有类型可用,我们可以确信能够表示SIZE_MAX + 1
,假设arr
确实有大小[=13] =],您需要 i
的类型才能表示该值以避免无限循环。除非你想要无限循环,这是可能的,尽管不太可能。
另一方面,如果我们有
char arr[NOT_SURE_HOW_LARGE_BUT_LESS_THAN_SIZE_MAX];
那么 i
的适当类型是 size_t
。这是 sizeof
运算符的结果类型,如果我们所做的唯一假设是对象的大小小于 SIZE_MAX
那么 size_t
是我们唯一可以有信心会达到目的。
如果我们可以假设对象的大小有更严格的界限,那么选择不同的类型可能会更有利。特别是,如果我们可以确信它小于 UINT_MAX
,那么 unsigned int
可能是一个性能稍高的选择。当然,有符号类型也可以用于 i
,前提是它们实际上可以表示所有需要的值,但这可能会引起某些编译器的警告。