【发布时间】:2012-05-21 22:51:11
【问题描述】:
#include <stdio.h>
int main(void) {
for (int i = 0; i < 5; i++) {
int arr[5] = {0};
// arr gets zeroed at runtime, and on every loop iteration!
printf("%d %d %d %d %d\n", arr[0], arr[1], arr[2], arr[3], arr[4]);
// overwrite arr with non-zero crap!
arr[0] = 3;
arr[1] = 5;
arr[2] = 2;
arr[3] = 4;
arr[4] = 1;
}
return 0;
}
显然这是可行的:
> gcc -Wall -Wextra -pedantic -std=c99 -o test test.c;./test
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
但是:
- 幕后发生了什么?
- 这是否保证适用于任何大小的数组?
- 我是否找到了在循环的每次迭代中将数组归零的最优雅方法?
【问题讨论】:
-
为了测试数组内容,循环并不是真正必要的尝试使数组成为全局变量(在发布中编译)并查看结果! ;)
-
是的,这就是重点。使用 {0} 初始化数组,无需重置其值!
-
我认为我们谈论的是不同的东西。而不是数组想象有:“int value = 0”。这是初始化,“value = 0”被重置。数组的 {0} 语法是 标准(仅当您想初始化为 0 时才有效),但您不能在声明之外使用它(因此循环本身对于测试/演示毫无用处目的)。读作:去掉循环,因为没用,问题是“{0} 做了什么?”
-
“作品”是偶然的;您在
for中未初始化i。 -
这将是一个“@pub”讨论!我的意思是,对于这个例子,循环是不相关的,因为你每次声明和初始化一个新变量(巧合的是,编译器可能会重用相同的堆栈空间)。这是一种可用于将数组初始化为零的语法(如链接帖子中所指出的)。如果将变量保留在循环之外并在循环中重置其内容,则循环可以演示某些内容,但不能使用该语法来完成。如果您将声明保留在那里,那么 loop scoped 或 function scoped 只是演示初始化语法。无论如何...
标签: c arrays loops initialization runtime