C 输出预测无法理解while语句

C 输出预测无法理解while语句,c,loops,while-loop,output,C,Loops,While Loop,Output,我在寻找这个问题的解决办法。我无法理解while部分以及它为什么打印6 #include <stdio.h> #include<stdlib.h> int main() { int array[] = {1, 2, 4, 0, 4, 0, 3}; int *p, sum = 0; p = &array[0]; while (*p++) sum += *p; printf("%d\n", sum);

我在寻找这个问题的解决办法。我无法理解while部分以及它为什么打印6

#include <stdio.h>
#include<stdlib.h>

int main() 
{
    int array[] = {1, 2, 4, 0, 4, 0, 3};
    int *p, sum = 0;

    p = &array[0];

    while (*p++)
        sum += *p;

    printf("%d\n", sum);
    return 0;
}
#包括
#包括
int main()
{
int数组[]={1,2,4,0,4,0,3};
int*p,和=0;
p=&数组[0];
而(*p++)
总和+=*p;
printf(“%d\n”,总和);
返回0;
}

这是一种更具可读性的while循环形式:

while (*p != 0)
{
  p = p + 1;   // you can put "p++;" here, which has the same effect
  sum += *p;
}

现在您应该自己理解了。

您正在丢弃数组第一个元素的值

这就是你看到答案6的原因

在移动到数组的下一个元素后,对元素求和

您应该在迭代结束时增加指针

while(*p){
  sum += *p;
  p++;
}


最初,指针
p
指向数组的第一个元素

p = &array[0];
但是,在评估while语句的条件之后

while(*p++)
sum += *tmp;
指针递增,然后指向数组的第二个元素,即
2

在循环体中使用递增指针

所以你会有

2 + 4
数组的第四个元素等于
0
。因此循环停止其迭代

您可以考虑while循环中的条件,如果将其重写为for循环

#include <stdio.h>

int main(void) 
{
     int array[] = {1,2,4,0,4,0,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 += *p;

然后,您将得到等于
7
的预期结果。循环将一直运行,直到遇到零值为止。但是,在将指针指向的内容添加到“sum”之前,请先递增指针

因此,循环将第二个和第三个元素相加,并在第四个元素处停止


sum的值是:0+2+4=6

while(*p)
sum += *p++;
解释

++、––
是一元运算符,用于将变量的值递增或递减1

它们可以用作
后缀
前缀

但这不仅仅是你的问题。当循环接收到
0
时终止。您的数组包含其中一个

因此,使用

for(int i=0;i<7;i++)  //7 -> size of array
sum += *p++;
for(int i=0;i数组大小
总和+=*p++;

o/p-
14

任何
非零
数字都是
true
条件。因此,您的循环一直运行到第一个
0
。为了您自己(也为了我们)请投入一两分钟的时间并格式化代码。问题的根本原因是忽略了C运算符的优先级,其中将执行
++
,然后取消引用
for(int i=0;i<7;i++)  //7 -> size of array
sum += *p++;