【问题标题】:Why does while(int) end when int = 0?为什么当 int = 0 时 while(int) 结束?
【发布时间】:2019-12-03 13:27:40
【问题描述】:

我正在尝试在 C++ 中找到与 Java 的 in.hasNextInt 等效的输入,但我找到了这个。

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector;
  int myint;

  std::cout << "Please enter some integers (enter 0 to end):\n";

  do {
    std::cin >> myint;
    myvector.push_back (myint);
  } while (myint);

  std::cout << "myvector stores " << int(myvector.size()) << " numbers.\n";

  return 0;
}

但我真的不明白为什么当输入为 0 时输入循环会停止。它有 while(myint) 循环,这也让我感到困惑,因为 myint 是一个整数而不是布尔值。当我们为myint 输入其他内容时,它可能会用作布尔值,但我认为 0 仍然可以作为整数。谁能给我解释一下?

【问题讨论】:

    标签: c++ boolean do-while implicit-conversion


    【解决方案1】:

    int 隐式转换为 bool。见here

    零值(用于整数、浮点和无作用域 枚举)和空指针和指向成员的空指针 值变为假。所有其他值都变为 true。

    【讨论】:

      【解决方案2】:

      来自 C++ 17 标准(7.14 布尔转换)

      1 算术纯右值、无范围枚举、指针或 指向成员类型 的指针可以转换为 bool 类型的纯右值。一种 零值、空指针值或空成员指针值是 转换为假;任何其他值都将转换为 true。对于直接 初始化 (11.6),std::nullptr_t 类型的纯右值可以是 转换为 bool 类型的纯右值;结果是假的。

      And(9 个语句)

      1. ...作为表达式的条件的值是 表达式,上下文转换为布尔语句其他 比切换;...

      因此do-while语句中的条件等价于

        do {
          std::cin >> myint;
          myvector.push_back (myint);
        } while ( myint != 0 );
      

      如果您需要将值 0 排除在推入向量中,则应按以下方式重写循环

      while ( ( std::cin >> myint ) and ( myint != 0 ) )
      {
          myvector.push_back( myint );
      } 
      

      【讨论】:

        【解决方案3】:

        当我们为 myint 输入其他内容时,它可能会用作布尔值,但我认为 0 仍然可以作为整数。

        我认为这就是您的误解所在。我们不能“为myint 输入其他内容”。它只能保存一个整数值。如果输入流无法解析整数,则不会将任何内容放入myint,它没有任何内容放入。

        所以你不能检查myint 是否持有整数或其他东西,没有其他东西可以持有除了 整数。因此,唯一的问题是如何测试整数的真实性。正如您已经被告知的,整数可以转换为布尔值。 0 为假,其他为真。这就是循环条件检查的内容。它只能检查什么。

        【讨论】:

          【解决方案4】:

          其他人已经解释了为什么 while(myint)myint 为 0 时停止,所以我想告诉你你可以做什么。

          首先你可以查一下return values on operator&gt;&gt;

          提取的值或序列不返回,而是直接存储在作为参数传递的变量中。 通过修改内部状态标志来发出错误信号

          这意味着您可以使用电话std::cin.good() 检查您的阅读是否有任何问题。然后当你给它一个不是 int 的输入(或空格,operator&gt;&gt; 默认忽略它)时,循环停止。

          do {
              std::cin >> myint;
              if (std::cin.good())  // Keep the last, failed read from inserting a 0
                  myvector.push_back(myint);
          } while (std::cin.good());
          

          希望这能给你一些可以借鉴的想法。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-11-07
            • 1970-01-01
            • 2011-06-08
            • 2021-11-17
            相关资源
            最近更新 更多