Code Bye

C++中逗号操作符的问题

如下代码:
#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;
 //...
}
相似的例子还可以举很多。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++中逗号操作符的问题