【问题标题】:Confused over while(cin >> x && x != 0) (when int x = 0) versus while(x != 0 && cin >> x ) (when int x = 1)混淆了 while(cin >> x && x != 0) (当 int x = 0) 与 while(x != 0 && cin >> x ) (当 int x = 1)
【发布时间】:2019-09-26 14:57:19
【问题描述】:

今天在我大学的讲座中,我们得到了这个:

输入:1、2、3、0、4

还有两个不同的代码

(1)

int x = 0;
int sum = 0;
int count = 0;
while (cin >> x && x != 0) {
    sum += x;
    count++;
}
cout  << static_cast<double>(sum) / count;

(2)

int x = 1;
int sum = 0;
int count = 0;
while (x != 0 &&  cin >> x ) {
    sum += x;
    count++;
}
cout  << static_cast<double>(sum) / count;

我知道第一个代码以输出 2 结尾,但显然第二个输出以 1.5 (6/4) 的输出结尾。我的困惑是为什么在输入零后循环变为假时计数为 4 - 它是条件中 cin 的位置,初始化的 x?我很困惑。谢谢!

【问题讨论】:

  • int sum x = 0; 无法编译。
  • int x = 1; vs int x=0; 只是为了避免第二个代码跳过循环。第一个代码可以有int x = 1; 并且没有区别。他们教过你如何使用调试器吗?
  • 相关(可能重复):How does C++ handle &&? (Short-circuit evaluation)。 TL/DR:如果读取数为0,则第一个循环不计算该数字,而第二个循环则计算。

标签: c++ loops while-loop do-while


【解决方案1】:

当你到达零时会发生什么?

while (cin >> x && x != 0)

你读入零,发现 x 为 0。你将停止迭代。

while (x != 0 && cin >> x)

现在x 设置为零,但您已检查先前 x 的值,该值尚未为零然后。所以你会再次进入循环:

sum += 0; // the current value of x
count++;  // one summand more

并且在后续循环运行中检查循环条件时才发现x变为零。

换句话说,在第二个变体中,您将零算作附加加数。

【讨论】:

    【解决方案2】:

    在第二种情况下,循环进入x == 0。它停止将 0 添加到 sum 并递增 count

    【讨论】:

      【解决方案3】:

      在第一个循环中,不计算值 0。而在第二个循环中,值 0 在变量 count 中被计数。

      while (x != 0 &&  cin >> x ) { // <== 0 is read
          sum += x;
          count++;  // <-- and count is increased
      }
      

      事实上,在第一个循环中,条件x != 0 是一个前置条件,而在第二个循环中,条件是一个后置条件

      第二个循环可以等效地重写(假设输入成功)

      do
      {
          cin >> x;
          sum += x;
          count++;
      } while ( x != 0 );
      

      【讨论】:

        猜你喜欢
        • 2014-11-09
        • 2021-03-25
        • 1970-01-01
        • 2012-12-09
        • 1970-01-01
        • 2013-09-25
        • 2017-01-19
        • 2021-11-18
        • 2020-09-12
        相关资源
        最近更新 更多