如下代码:
#include <iostream> using namespace std; int main(){ int ival; while (cin>>ival,!cin.eof()){ if (cin.bad()) throw runtime_error("IO 流中断.."); if (cin.fail()) { cerr << "数据流错误,再试一次.."; cin.clear(istream::failbit); cin.ignore(std::numeric_limits<std::streamsize>::max(), ""\n""); continue; } } system("pause"); return 0; }
原意是用逗号操作符测试输入的数据流,调试的时候发现cin不取变量的数据到缓冲区,导致死循环。这是什么原因?
解决方案:20分
不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) { if (条件1) break; //... if (条件2) continue; //... if (条件3) return; //... } 原因是前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。 典型如: 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) { a=fgetc(f); //... b=fgetc(f);//可能此时已经feof了! //... } 而这样写就没有问题: while (1) { a=fgetc(f); if (feof(f)) break; //... b=fgetc(f); if (feof(f)) break; //... } 相似的例子还可以举很多。