2012-08-14 38 views
0

作爲一個專業程序員,這使我感到困惑。我可能只是想念一些東西。在C++代碼中,我已經看到類似這樣的東西:C++ while語句的失敗函數?

while (cin.get(c)) {...} 

幾乎就好像它是一個try語句。如果語句成功,就像函數返回true,否則返回false。我已經看過很多這樣的東西,有時用其他語言。它是如何工作的?我只是缺少一些東西(比如函數返回false,如果它不起作用)。如果不是,這是否適用於所有語言?

+0

我認爲你在找什麼,是沿着「真理」和「虛假」的價值觀。這些因語言而異......例如,0是「假」值(在C/C++/JavaScript/etc中),而其他每個整數都是「真值」值。 – 2012-08-14 00:51:50

+0

'cin.get()'讀取包含空格的單個字符並將其存儲在變量中,在您的情況c。它也可以被稱爲'c = cin.get()'。您也可以使用cin.get()來暫停屏幕,直到用戶按下ENTER鍵。知道並沒有看到這個例子,似乎是一個無限循環。 – ChiefTwoPencils 2012-08-14 01:02:43

+0

@RobertoWilko在我看來,就像循環直到EOF(ctrl + D)一樣。 – 2012-08-14 01:05:24

回答

0

看一看:http://www.cplusplus.com/reference/iostream/istream/get/ 您使用的版本是第二個(istream& get (char& c);)。在C++中,正如pst所說的,任何不同的0或NULL值都是真的,否則它將是錯誤的。在你的情況下,每次調用cin.get將返回* this,這將是真實的,所以,你將得到一個無限循環,直到發生一些「問題」,比如讀取EOF「char」(^ C => Ctrl + C)在Windows中)。

+0

如果它完全遇到問題,它會返回什麼?它只是提出一個錯誤? – 2012-08-14 01:39:35

+0

@Mike:當問題發生時,流自身設置標誌(取決於錯誤的類型)並且仍然返回自身。流有一個運算符將自己轉換爲'bool'或'void *'(我忘了),並且如果設置了這些標誌,那麼該運算符會返回一個falsy值(分別爲「false」或null)。 – cHao 2012-08-14 02:04:42

+0

@cHao好的,謝謝。 – 2012-08-14 02:11:13

3

一個C++參考文件會注意到get(char_type &)方法的返回值是*this,其類型爲basic_istream &1)。 basic_istream繼承自basic_ios,它具有一個轉換運算符,如果存在I/O故障,則返回false,否則返回true(2)。

0

一種if語句計算的表達式真理...真實地表達可以與值true直接評估爲布爾值,或在一定值,該值可以被隱式轉換爲true(例如,數字/指針的值是如果不是0,則爲true)。

函數可以返回truefalse,或返回某個具有轉換運算符的對象爲布爾類型或數值類型。

在這種情況下,cin.get(c)返回到cin對象,該對象可以被隱式轉換爲布爾的基準(來自void* - 見http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/)來檢查輸入操作的成功或失敗。

這不適用於所有函數或所有語言 - 它只適用於那些恰好返回布爾值或數值的函數,這樣纔有意義進行測試。例如:

if (std::cin >> a >> b) // true if both inputted successfully... 

if (my_vector.capacity()) // useless? - capacity may be >0 "true" irrespective of size() 

if (my_vector.empty())  // makes sense - returns a boolean 

if (my_vector.size())  // makes sense - returns a number, non-0 is "true" 
          // dubious style as a change from vector to list would require 
          // a change to !empty() to maintain O(1) performance in C++03 
0

IOStreams庫是故意用這種方式設計的。這些操作會返回對正在操作的流的引用,並且該流可根據其狀態轉換爲值爲bool的值。

我明白了爲什麼它可能是一個意想不到的成語,但它確實爲一些富有表現力的代碼。