2016-07-27 1727 views
1

如果不考虑operator !=,<<,则可以通过包含<string>头来删除此错误。错误:没有运算符“!=”与这些操作数匹配

但是这似乎并不适用于operator !=

所以,我想可能是这个错误是由于我比较变量的类型的差异。

所以我考虑类型铸造。

这里是我想要做的事:

while ((cin >> value) != 0) { ... } 

值的类型是int

,我考虑的一些选项有:

  1. 静态浇铸:因为我们在运行时接受价值不能使用。
  2. 动态转换:因为value不能使用不是指针
  3. reinterpret_cast:同

我有什么其他选择?

你可以建议一些替代品,但我想知道如何使它工作。

+0

首先和最重要的是:你想通过这种比较来实现什么?你为什么要比较流为零? – AnT

回答

6

(cin >> value)的结果值不是value的内容,而是cincin可以在布尔上下文中评估,但不会与int比较,因此编译错误。

您可以修改该行(使用逗号运算符);

while ((cin >> value, value) != 0) 

这里所得的是逗号运算符的第二个操作数,因此value。反过来,它将正确地与0进行比较。虽然现在放弃cin流的有效性测试。

Demo

虽然上面提出了一个微小的变化,但代码本身往往是模糊的,错过了一些错误检查。最好重构条件并在cin中提供更多的错误检查;

while ((cin >> value) && (value != 0)) { 
    //... 
} 

Demo

+1

加一:喜欢使用逗号运算符。令人遗憾的是,虽然当前在代码中学习C++的代码审查人员可能不允许。 – Bathsheba

+0

@Bathsheba悲伤版本的逗号没有做任何错误检查。它可以在C++ 11及更高版本中正常工作,但不会更早。你将不得不启用'cin'的异常或者风险无限循环。 –

+0

@Revolver_Ocelot。正确。我把它作为一个最小的改变,让编译工作,以及更多错误检查的解决方案。不检查您的流的有效性只是要求问题... – Niall

2

你可以写一个函数foo(参照采取cin),基本上包含

cin >> value; 
return value; 

,写while ((value = foo(cin)) != 0){...}foo可以利用异常机制来报告阅读中的任何错误。你甚至可以用替代foo lambda函数但真的,这相当混乱的东西。只要接受cin >> value是一个表达式与一个流类型,并与它一起工作。

1

你可以重写你的while环路作为for循环:

#include <iostream> 

int main() 
{ 
    int value; 
    for(std::cin >> value; value != 0; std::cin >> value) { 
     std::cout << value << std::endl; 
    } 
} 

live example

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'; 
    } 
} 

http://ideone.com/bZ9PwJ

这患有这个问题,如果你从CIN你将永远停留在你的循环(http://ideone.com/JtI9fp)一个错误的输入。

#include <iostream> 

int main() { 
    int value; 
    while (std::cin >> value && value != 0) { 
     std::cout << value << '\n'; 
    } 
} 

http://ideone.com/OjI01d

此离开两个坏输入和输入回路与0

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时间。

相关问题