【问题标题】:Output prediction cannot understand the while statement输出预测无法理解while语句
【发布时间】:2019-11-21 12:56:56
【问题描述】:

我正在寻找这个问题的解释。我无法理解 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;
}

【问题讨论】:

  • 任何non-zero 号码都是true 条件。因此,您的循环将一直运行到第一个 0
  • 为了您自己(以及我们自己),请花一两分钟的时间格式化您的代码
  • 问题的根本原因是忽略了C运算符优先级,这里会执行++,然后是解引用

标签: c loops while-loop output


【解决方案1】:

这是您的 while 循环更易读的形式:

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

现在你应该自己理解了。

【讨论】:

    【解决方案2】:

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

    p = &array[0];
    

    但是在评估 while 语句的条件之后

    while(*p++)
    

    指针递增,之后它指向数组的第二个元素,即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 += *tmp;
    

    而不是

    sum += *p;
    

    那么你将得到等于7的预期结果。

    【讨论】:

      【解决方案3】:

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

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

      你对元素求和之后你已经移动到数组的下一个元素

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

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

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

      【讨论】:

        【解决方案4】:

        循环一直运行,直到遇到零值。但是,在将指针指向的内容添加到“总和”之前,您将指针递增。

        所以循环将第二个和第三个元素相加并在第四个元素处停止。

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

        【讨论】:

          【解决方案5】:

          只需将while 循环修改为

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

          说明

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

          它们可以用作postfixprefix

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

          所以,改为使用

          for(int i=0;i<7;i++)  //7 -> size of array
          sum += *p++;
          

          o/p - 14

          【讨论】:

            猜你喜欢
            • 2016-07-14
            • 2021-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-12
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多