2012-10-12 73 views
4

我有這樣的代碼:負值輸入

double i; 
while(cin >> i) 
{ 
    if (i < 0.0) 
     cout << "ENTER A POSITIVE NUMBER: "; 
    else 
     break; 
} 

我想這樣的代碼(我不希望使用破裂時):

while((cin >> i) < 0.0) 
{ 
    cout << "ENTER A POSITIVE NUMBER: "; 
} 

我得到一個錯誤這條線:while((cin >> i) < 0.0)invalid operands to binary expression

我錯過了什麼?

回答

4

表達(cin >> i)不返回雙倍返還。

你可以寫相同的語句,沒有break,如:

double i; 
while ((cin >> i) && (i < 0.0)) { 
    cout << "ENTER A POSITIVE NUMBER: "; 
} 
+0

它不返回布爾值。 http://www.cplusplus.com/reference/iostream/istream/operator%3E%3E/ –

+0

@CodingMash:我的錯,編輯它。謝謝! –

+0

將代碼恢復爲正確的代碼。你可能想重新解釋一下這個解釋,因爲'cin >> i'不會產生一個布爾值,而是一個對流的引用(它可以被轉換爲'bool') –

2

返回值cin >> i是流,而不是讀取值。這是爲了讓操作數的鏈接

cin >> i >> j; 

你可以試試這個:

while((cin >> i, i) < 0.) 
{ 
    cout << "ENTER A POSITIVE NUMBER: "; 
} 

逗號操作符應返回的i的價值,但我沒有測試它。

編輯:不要使用這種方法,因爲大衛羅德里格斯已經注意到這丟棄了閱讀的結果。改爲使用while((cin >>i) && (i<0.))

+1

-1這種方法的問題是,它完全忽略讀的結果。假設'i'是負數,並且用戶關閉輸入流(或者輸入一個字母不能解析爲'double'並在流中設置'fail'位),那麼後面的讀取將失敗,並且值'i'不會更新,在無限循環中仍然是正數。 –

+0

是的,我用while((cin >> i)&&(i <0)) –

0

做:

while(cin >> i && i < 0.0) 
{ 
    cout << "ENTER A POSITIVE NUMBER: "; 
} 

錯誤是由於這樣的事實,表達(cin >> i)不適用於具有雙重對比造成的。

+0

我已經玩過'operator'了一段時間,你保證''cin >> i'在'i <0.0'之前運行,當逗號左邊的東西是一個對象嗎? –

+1

與Alex'相同的問題。逗號運算符放棄第一個表達式。如果輸入是'-1 a',則會遇到無限循環。在第一次迭代中,'i'被設置爲'-1',在讀取失敗之後,'i'未被修改,並且你進入一個無限循環。 –

+1

@MaxLybbert:是的,這是由標準保證的,但這個答案有其他問題。 –

10

像這樣使用它。

while ((cin >> i) && (i < 0.0)) 

重載函數爲cin返回通過istream class參考的對象。所以你不能將它與一個雙重值進行比較。

cin >> i 
|-------| //this is an object of istream class 
+1

+1,重要的是要注意'&&'是一個序列點(舊的C++ 03說法),因此保證'(i <0.0)'只會在'cin >> i'後面被評估。 –

+0

就是這樣;我忽略了這一事實,即做一個布爾檢查。總體感覺。 –

4

要檢查我的價值,而不是CIN

while((cin >> i) && (i < 0.0)) 
{ 
    cout << "ENTER A POSITIVE NUMBER: "; 
}