我正在寻找这个问题的解释。我看不懂while部分,为什么会打印6。
#include <stdio.h>
#include<stdlib.h>
int main()
{
int array[] = {1,2,4,3};
int *p,sum = 0;
p = &array[0];
while (*p++)
sum += *p;
printf("%d\n",sum);
return 0;
}
我正在寻找这个问题的解释。我看不懂while部分,为什么会打印6。
#include <stdio.h>
#include<stdlib.h>
int main()
{
int array[] = {1,2,4,3};
int *p,sum = 0;
p = &array[0];
while (*p++)
sum += *p;
printf("%d\n",sum);
return 0;
}
这是while循环更易读的形式:
while (*p != 0)
{
p = p + 1; // you can put "p++;" here,which has the same effect
sum += *p;
}
现在您应该自己理解。
,最初,指针p
指向数组的第一个元素。
p = &array[0];
但是,在评估while语句的条件之后
while(*p++)
指针被递增,然后指向数组2
的第二个元素。
在循环体内使用了增量指针。
所以您将拥有
2 + 4
数组的第四个元素等于0
。因此,循环将停止其迭代。
如果将其重写为for循环,则可以通过以下方式考虑while循环中的条件
#include <stdio.h>
int main(void)
{
int array[] = {1,2,4,3};
int *p,sum=0;
p = &array[0];
for ( int *tmp = p; ( ++p,*tmp != 0 ); tmp = p )
{
sum += *p;
}
printf("%d\n",sum);
return 0;
}
如果在正文中使用该语句
sum += *tmp;
代替
sum += *p;
然后您将获得等于7
的预期结果。
您要从数组的第一个元素中丢弃该值。
这就是您看到答案6的原因
您对元素之后求和,您已经移至数组的下一个元素
您应该在迭代结束时增加指针
while(*p){
sum += *p;
p++;
}
或
for( ; *p ; p++){
sum += *p;
}
,
循环运行直到遇到零值为止。但是,您需要先增加指针,然后再将其指向的对象添加到“ sum”。
因此循环将第二个和第三个元素相加,并在第四个元素处停止。
则总和的值为:0 + 2 + 4 = 6
,只需将您的while
循环修改为
while(*p)
sum += *p++;
说明
++,––
是一元运算符,用于递增或递减变量的值1。
它们可以用作postfix
或prefix
但这不只是您的问题。 While循环在收到0
时终止。您的数组包含其中之一。
所以,改为使用
for(int i=0;i<7;i++) //7 -> size of array
sum += *p++;
o / p-14