for循环中没有检查条件,但循环仍然终止C ++

时间:2015-12-07 13:59:41

标签: c++ for-loop operator-overloading

我在C ++中有这个程序有一个简单的for循环,for循环没有检查条件:

for (std::string a_word; std::cin >> a_word;) {
  // code goes here
}

// Code after the loop

我编译它们并在终端上运行,当我按下Ctrl + D(EOF)时,for循环然后停止并在循环后运行代码,虽然没有检查条件,有人可以解释引擎盖下发生了什么吗? / p>

3 个答案:

答案 0 :(得分:7)

你错了。循环中有一个条件

for (std::string a_word; std::cin >> a_word;) {
                         ^^^^^^^^^^^^^^^^^^
  // code goes here
}

std::cin >> a_word;

for语句的这一部分中的任何表达式(或声明)都在上下文中转换为bool类型。

来自C ++标准(6.4选择语句)

  
      
  1. ...作为表达式的条件的值是表达式的值,上下文转换为bool 用于其他语句   比开关;
  2.   

在C ++ Standatrd

中为流定义了显式运算符
explicit operator bool() const;

返回!fail()

表达式std::cin >> a_word;会返回对std::cin的引用,并会应用上面显示的转化运算符。

因此,当您按下Ctrl + D时,fail()会返回true,并且循环条件(!fail())等于false

答案 1 :(得分:0)

但你在循环中有条件。任何流can be used in a condition和输入运算符>>都会返回流。

答案 2 :(得分:0)

istream& istream::operator>>(T&)返回一个可转换为bool(operator bool() const)的istream对象,并在出现错误条件时(EOS或Ctrl + D符合错误条件)转换为false。 / p>