2015-03-19 98 views

回答

3

由於C++插入到零的隱式相比,該線

if (!std::getline(std::cin, cmdline)) break; 

相當於

if (!std::getline(std::cin, cmdline) != 0) break; 

或簡單地

if (std::getline(std::cin, cmdline) == 0) break; 

std::getline返回它在其上稱爲流。流將被轉換爲boolvoid*,具體取決於C++庫的版本。達到輸入結束時,轉換後的值變爲零。這就是爲什麼當沒有額外的輸入讀取時循環結束。

另一種方式來寫相同的代碼將如下所示:

std::string cmdline; 
while (std::getline(std::cin, cmdline)) { 
    std::istringstream cmdstream(cmdline); 
    std::string cmd; 
    cmdstream >> cmd; 
    ... 
} 

這可以讓你把結束條件進入循環頭,在宣佈cmdline外循環的代價。

+0

「當達到輸入結束時,std :: getline返回0」它實際上返回流本身,然後使用它的布爾轉換運算符將其上下文轉換爲「bool」。 'std :: getline == 0'是一個編譯時錯誤(在> = C++ 11中),在C++ 03中,轉換爲'void *',然後將其與空指針常量'0'進行比較它有效。 – 0x499602D2 2015-03-19 01:12:08

+0

@ 0x499602D2感謝您的評論!我不想在這裏介紹一些小細節,但我想這是無法避免的。 – dasblinkenlight 2015-03-19 01:15:14

1

std::getline返回對作爲第一個參數傳遞的流的引用,在您的情況下爲std::cin。這意味着你的

if (!std::getline(std::cin, cmdline)) break; 

相當於

std::getline(std::cin, cmdline); 
if (!std::cin) break; 

最後一行就相當於

if (std::cin.fail()) break; 

這將打破週期,如果getline流中提出failbit標誌。如果I/O錯誤或流結束條件阻止getline讀取任何內容,則會發生這種情況。