作爲一個專業程序員,這使我感到困惑。我可能只是想念一些東西。在C++代碼中,我已經看到類似這樣的東西:C++ while語句的失敗函數?
while (cin.get(c)) {...}
幾乎就好像它是一個try語句。如果語句成功,就像函數返回true,否則返回false。我已經看過很多這樣的東西,有時用其他語言。它是如何工作的?我只是缺少一些東西(比如函數返回false,如果它不起作用)。如果不是,這是否適用於所有語言?
作爲一個專業程序員,這使我感到困惑。我可能只是想念一些東西。在C++代碼中,我已經看到類似這樣的東西:C++ while語句的失敗函數?
while (cin.get(c)) {...}
幾乎就好像它是一個try語句。如果語句成功,就像函數返回true,否則返回false。我已經看過很多這樣的東西,有時用其他語言。它是如何工作的?我只是缺少一些東西(比如函數返回false,如果它不起作用)。如果不是,這是否適用於所有語言?
看一看: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中)。
如果它完全遇到問題,它會返回什麼?它只是提出一個錯誤? – 2012-08-14 01:39:35
@Mike:當問題發生時,流自身設置標誌(取決於錯誤的類型)並且仍然返回自身。流有一個運算符將自己轉換爲'bool'或'void *'(我忘了),並且如果設置了這些標誌,那麼該運算符會返回一個falsy值(分別爲「false」或null)。 – cHao 2012-08-14 02:04:42
@cHao好的,謝謝。 – 2012-08-14 02:11:13
一種if
語句計算的表達式真理...真實地表達可以與值true
直接評估爲布爾值,或在一定值,該值可以被隱式轉換爲true
(例如,數字/指針的值是如果不是0,則爲true)。
函數可以返回true
或false
,或返回某個具有轉換運算符的對象爲布爾類型或數值類型。
在這種情況下,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
IOStreams庫是故意用這種方式設計的。這些操作會返回對正在操作的流的引用,並且該流可根據其狀態轉換爲值爲bool
的值。
我明白了爲什麼它可能是一個意想不到的成語,但它確實爲一些富有表現力的代碼。
我認爲你在找什麼,是沿着「真理」和「虛假」的價值觀。這些因語言而異......例如,0是「假」值(在C/C++/JavaScript/etc中),而其他每個整數都是「真值」值。 – 2012-08-14 00:51:50
'cin.get()'讀取包含空格的單個字符並將其存儲在變量中,在您的情況c。它也可以被稱爲'c = cin.get()'。您也可以使用cin.get()來暫停屏幕,直到用戶按下ENTER鍵。知道並沒有看到這個例子,似乎是一個無限循環。 – ChiefTwoPencils 2012-08-14 01:02:43
@RobertoWilko在我看來,就像循環直到EOF(ctrl + D)一樣。 – 2012-08-14 01:05:24