2016-07-27 120 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時間。

相關問題