【问题标题】:How does cin evaluate to true when inside an if statement?在 if 语句中,cin 如何评估为真?
【发布时间】:2016-04-14 14:57:57
【问题描述】:

我认为:

if (true) 
{execute this statement}

那么if (std::cin >> X) 在没有任何“真”的情况下如何执行为真呢?我可以理解是if ( x <= y) 还是if ( y [operator] x ),但是“istream = true”是什么逻辑。

【问题讨论】:

  • 如果“接受”一个布尔值。因此, ( ) 中的任何内容都将通过运算符 bool() 转换为 bool;另见stackoverflow.com/questions/6791520/…
  • 如果最后一次操作成功,则流是“true-ish”。
  • 你需要问自己的第一个问题是表达式(std::cin >> X)的值是什么。
  • @Exceptyon 是否意味着任何 iostream 的计算结果都为真?还是只有cin?抱歉这个菜鸟问题
  • 如果读取成功,@chaosfirebit 应该返回 true。因此,如果还有要读取的内容,则可以执行转换。诠释 x;辛>>x;将在输入“test”时返回 false

标签: c++ if-statement


【解决方案1】:

答案取决于标准 C++ 库的版本:

  • 在 C++11 之前,if 内部的转换依赖于使用 operator void* 将流转换为 void*
  • 从 C++11 开始,转换依赖于 operator boolstd::istream

注意std::cin >> X不仅是一个语句,还是一个表达式。它返回std::cin。 “链式”输入需要此行为,例如std::cin >> X >> Y >> Z。当您将输入放在if 中时,同样的行为会派上用场:结果流被传递给operator booloperator void*,因此布尔值被提供给条件。

【讨论】:

  • 所以答案与问题是关于if (cin)的一样?
  • @EnricoMariaDeAngelis 对,这是另一种说法。
【解决方案2】:

if(x) 等价于if(bool(x))

在这种情况下,bool(x) 调用 std::istream::operator bool(x)

这将返回:

如果没有设置 failbitbadbit,则为 true。

否则为假。

【讨论】:

    【解决方案3】:

    std::cinstd::basic_istream 类型,它继承自 std::basic_ios,它有一个运算符:std::basic_ios::operator bool,在 if 语句中使用时会调用它。

    【讨论】:

      【解决方案4】:

      if 条件中的内容将被评估为bool

      if(cin >> X) 表示如果条件为true,则向X 读取了某些内容;如果条件是false,则发生了其他事情(例如流结束)并且X 没有改变。

      例如要阅读直到流结束,您可以使用while(cin >> X)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-27
        • 2010-12-01
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多