C ++ while(cin>> x){} vs. while(true){cin>> x;}

时间:2013-01-27 04:27:25

标签: c++

请考虑使用此C ++代码创建和遍历链接列表(由用户决定的节点数,而不是程序员)

#include <iostream>
using namespace std;
class Node
{ 
 public:
 int data; Node* next;
 Node(int d, Node* j): data(d),next(j) {cout << "Constructor\n";}
};

int main()
{int n; Node* p; Node* q = 0;

while(cin >> n) 
{ p = new Node(n,q);
  q = p;}

for(;p->next; p=p->next)
    cout << p->data << "->";
    cout << p-> data << "->*\n";
return 0;}

上面的代码运行正常,用户可以使用 Ctrl + D ,然后 输入来终止 即可。但是,如果我们使用cin&gt;&gt;替换while(cin&gt;&gt; n)with while(true) N;在循环内部,如此处所示

    while(true) 
    { cin >> n;
    p = new Node(n,q); q = p;}

然后在用户尝试终止时,循环继续自动创建新节点!为什么?? 提前致谢

3 个答案:

答案 0 :(得分:3)

它继续运行,因为循环条件为true,使其成为无限循环。如果要打破无限循环,可以使用break语句,例如

while (true) {
    if (!(cin >> n)) {
        break; // exits the loop
    }
    p = new Node(n,q);
    q = p;
}

答案 1 :(得分:1)

也许存在一种误解,即代码cin >> n在遇到文件结束时会以某种方式自动导致循环中断。实际上,我们必须隐式检查文件的结尾,如原始示例或@MrFooz'解决方案中所示,或明确地检查,如下所示:

while(true) { 
    cin >> n;
    if (cin.eof()) break; // We're explicitly checking for EOF here
    p = new Node(n,q);
    q = p;
}

答案 2 :(得分:0)

Ctrl + D表示EOF,这可能会导致&gt;&gt;返回false的操作,因为用户已发出stdin的结束信号。