错误:没有运算符“!=”与这些操作数匹配
如果不考虑operator !=
,<<
,则可以通过包含<string>
头来删除此错误。错误:没有运算符“!=”与这些操作数匹配
但是这似乎并不适用于operator !=
。
所以,我想可能是这个错误是由于我比较变量的类型的差异。
所以我考虑类型铸造。
这里是我想要做的事:
while ((cin >> value) != 0) { ... }
值的类型是int
。
,我考虑的一些选项有:
- 静态浇铸:因为我们在运行时接受价值不能使用。
- 动态转换:因为
value
不能使用不是指针 -
reinterpret_cast
:同
我有什么其他选择?
你可以建议一些替代品,但我想知道如何使它工作。
(cin >> value)
的结果值不是value
的内容,而是cin
。 cin
可以在布尔上下文中评估,但不会与int
比较,因此编译错误。
您可以修改该行(使用逗号运算符);
while ((cin >> value, value) != 0)
这里所得的是逗号运算符的第二个操作数,因此value
。反过来,它将正确地与0
进行比较。虽然现在放弃cin
流的有效性测试。
Demo。
虽然上面提出了一个微小的变化,但代码本身往往是模糊的,错过了一些错误检查。最好重构条件并在cin
中提供更多的错误检查;
while ((cin >> value) && (value != 0)) {
//...
}
Demo。
你可以写一个函数foo
(参照采取cin
),基本上包含
cin >> value;
return value;
,写while ((value = foo(cin)) != 0){...}
。 foo
可以利用异常机制来报告阅读中的任何错误。你甚至可以用替代foo
lambda函数但真的,这相当混乱的东西。只要接受cin >> value
是一个表达式与一个流类型,并与它一起工作。
你可以重写你的while
环路作为for
循环:
#include <iostream>
int main()
{
int value;
for(std::cin >> value; value != 0; std::cin >> value) {
std::cout << value << std::endl;
}
}
如果表达式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
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;
}
然后它总是会给真正的输出,因为每一个变量什么的value
值是cin>>value
回报true
时间。
首先和最重要的是:你想通过这种比较来实现什么?你为什么要比较流为零? – AnT