如果考虑operator !=
代替<<
,则可以通过添加<string>
标头来删除此类错误。
但这似乎不适用于operator !=
。
所以,我认为可能是这个错误是由于我所比较的变量类型不同。
所以我考虑了类型转换。
这是我正在尝试做的事情:
while ( (cin >> value) != 0) { ... }
值的类型为int
。
我考虑的一些选项是:
value
不是指针reinterpret_cast
:相同我还有其他选择吗?
您也可以建议一些替代方案,但我想知道如何使其发挥作用。
答案 0 :(得分:6)
(cin >> value)
的结果值不是value
的内容,而是cin
的内容。 cin
可以在布尔上下文中计算,但不与int
进行比较,因此编译错误。
您可以修改该行(使用逗号运算符);
while ( (cin >> value, value) != 0)
这里的结果是逗号运算符的第二个操作数,因此是value
。反过来,它会正确地与0
进行比较。虽然这现在放弃了cin
流的有效性测试。
虽然上面提到了一个最小的变化,但代码本身往往模糊不清,并且错过了一些错误检查。最好重构条件并在cin
;
while ( (cin >> value) && (value != 0) ) {
//...
}
答案 1 :(得分:2)
您可以编写一个函数foo
(通过引用引用cin
),基本上包含
cin >> value;
return value;
并写下while ((value = foo(cin)) != 0){...}
。 foo
可以利用异常机制报告读数中的任何错误。您甚至可以用 lambda 函数替换foo
但实际上,这相当混淆了事情。只需接受cin >> value
是带有流类型的表达式,然后使用它。
答案 2 :(得分:1)
您可以将while
循环重写为for
循环:
#include <iostream>
int main()
{
int value;
for( std::cin >> value; value != 0; std::cin >> value) {
std::cout << value << std::endl;
}
}
答案 3 :(得分:0)
如果表达式cin >> value
评估为value
,您将无法执行此操作:
cin >> v1 >> v2
请记住cin >> value
等同于
cin.operator>>(value);
快速查看std::istream::operator>>
告诉我们它会返回std::istream&
。所以cin >> v1 >> v2
是
cin.operator>>(v1).operator>>(v2);
或
istream& is = cin.operator>>(v1);
is.operator>>(v2);
您的代码:
(cin >> value) != 0
是
istream& is = cin.operator>>(value);
if (is != 0) // error: comparing `istream` and `int`.
你或许可以写:
while (cin >> value, value != 0) {
此评估cin >> value
,放弃结果(即cin
),然后评估value != 0
。
#include <iostream>
int main() {
int value;
while (std::cin >> value, value != 0) {
std::cout << value << '\n';
}
}
这会遇到这样的问题:如果你从cin那里得到一个错误的输入,你将永远陷入你的循环(http://ideone.com/JtI9fp)。
#include <iostream>
int main() {
int value;
while (std::cin >> value && value != 0) {
std::cout << value << '\n';
}
}
这会在错误输入和值为0的输入上退出循环。
答案 4 :(得分:0)
cin>>value
返回cin
这为我们提供了使用cin>>val1>>val2
的灵活性。
因此,如果我们将其用作条件,它将作为布尔值并返回True(cin>>value).
如果您希望使用cin
作为条件,那么您可以使用以下方法..
int value;
while(cin>>value)
{
if(value!=0)
cout<<"true"<<endl;
else
cout<<"false"<<endl;
}
这将给出正确的结果。但是如果我们使用
int value;
while(cin>>value!=0)
{
cout<<"True"<<endl;
}
然后它将始终作为输出给出true,因为每次变量value
的值为cin>>value
都会返回true
。