簡體   English   中英

C ++:我不明白while循環的工作原理

[英]C++: I don't understand how this while loop works

我正在看這里的一些問題,這些問題向您展示了如何從txt文件讀取內容,然后將其中的任何內容分配給單獨的變量。 答案使用了一個while循環,看起來像這樣……

ifstream file(“file.txt”);

int var1;
int var2;
int var3;

while (file >> var1 >> var2 >> var3)
{
    /* do something with name, var1 etc. */
    cout << var1 << var2 << var3 << “\n”;
}

我的問題是,while循環中發生了什么,它允許它為那些變量分配正確的值? 我知道它有效,因為我使用過它,但是我只是不明白它是如何工作的。

這是我正在查看的鏈接,以防萬一有人想要也查看它。 C ++:從文本文件讀取並分成變量

謝謝!

基本上,“表達式” (a) file >> var1 >> var2 >> var3將嘗試從file流中讀取三個值並將它們放入指定的變量中。 基本上,它本身與cin >> myVar沒什么不同(除了它是將輸入更改為多個變量)。

當且僅當成功讀取所有三個值時,整個表達式的才為true。

在這種情況下,將執行循環主體,將打印出三個值,然后循環將返回頂部並嘗試獲取下三個值。

在表達式的計算結果為假的點(即未讀取三個值),循環將停止。


(a)someStream >> someVariable到Boolean值的實際路徑涉及流類中的幾個步驟(將operator>>的返回值轉換為帶有operator bool的Boolean),但是以上解釋對於大多數人來說應該足夠好目的。

ifstream重載operator >> 在您的特定情況下,它是:

basic_istream& operator>>( int& value );

如您所見,它返回對自身的引用,因此您可以重寫:

 while (file >> var1 >> var2 >> var3)

作為函數調用:

while (file.operator>>(var1).operator>>(var2).operator>>(var3))

另外,ifstream明確轉換為bool,如果stream正常,則為true,否則為false。 使用操作符bool進行此轉換,該操作符被標記為顯式的 (C ++ 11及更高版本)。 應用於轉換運算符的該說明符允許在while循環或if語句中使用ifstream實例,但不允許您例如將其分配給bool變量:

bool b = file; // results in error

編譯器會將file >> var1 >> var2 >> var3為: file.operator>>(var1).operator>>(var2).operator(var3)

basic_istream::operator>>(int&)的返回值是basic_istream&因此提取操作符可以在返回時重復調用,因為它返回了對自身的引用。

當您將其評估為: while(file >> var1 >> var2 >> var3) ,編譯器實際上正在執行: while(file.operator>>(var1).operator>>(var2).operator(var3).operator bool())我們可以看到basic_stream提供了operator bool() ,這將作為while循環的條件進行評估。 operator bool()

如果流沒有錯誤並且可以進行I / O操作,則返回true 具體來說,返回!fail()

因此,這一行的可讀解釋是:“將var1var2var3插入file 。如果插入沒有失敗,則繼續循環。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM