对于着名的问题。
有100个人站在一个从1到100的圆圈中。第一个人拿着一把剑并且顺时针杀死站在他旁边的人,即1杀2,依此类推。哪个是最后一个还活着?最后一个号码站在哪一个?
在此问题的以下C代码中。
void main(){
int i=0, j; //i has the sword, j gets killed.
int a[N]={0}; //0=not killed
while(1){
if(i != N-1) j = i + 1;
else j = 0;
while(a[j])
if((j + 1) == N) j = 0; //loop back to 0
else j++; //skip over the killed people
if(i==j){ //if i is the only one left, stop
printf("\n\n\n%d is left!", i+1);
return;
}
a[j] = 1; //kill j
printf(" %d kills %d.", i+1, j+1);
if(j != N-1) i = j + 1;
else i=0;
while(a[i])
if((i + 1) == N) i = 0;
else i++;
}
}
请告诉我int a[N]={0};
// 0 =未在行中被杀的含义。 6谢谢。
答案 0 :(得分:2)
在您的代码中,
int a[N]={0};
正在将所有数组a
的成员初始化为0.
根据C11
标准,章节§6.7.9,初始化,(强调我的)
如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,聚合的其余部分应为 隐式初始化与具有静态存储持续时间的对象相同。
,对于静态存储类型int
的初始化值,算术类型,
[...]如果它有算术类型,则初始化为(正或无符号)零;
和a
是int
类型的数组,因此它将所有成员初始化为0
作为值。 a[0]
将显式初始化为0
(已提供),其余的将获得隐式初始化。
FWIW,N
必须是编译时常量值,如
#define N 50 //or any value
让这个工作。
答案 1 :(得分:1)
它基本上告诉编译器这将是一个大小为N的数组,并且都将被初始化为零。因此,当您尝试显示此数组的输出时,您将看到N个零。
答案 2 :(得分:0)
有点类似于:
memset(a, 0, N * sizeof(int))