2016-12-28 71 views
-1

給定鏈表的頭部,當通過鏈表來計算列表的大小時,常用的方法可能是C++ while()...關於執行一行代碼的條件

ListNode* curr = head; 
int count = 0; 
while(curr) { 
    curr = curr->next; 
    count++; 
} 

但我也看到有人這樣做:

ListNode* curr = head; 
int count = 0; 
while(curr = curr->next) { 
    count++; 
} 

記得在解析字符串,我們經常做

stringstream content(intputStr); 
string outputStr; 
while(content >> outputStr) { 
    ... 
} 

我wond ering可以在執行一行代碼(e.x.)時始終調用while()。在這個主題中,關於curr = curr-> next的條件)?如果不是,邊緣情況是什麼?這是一個很好的做法嗎?

感謝

+2

'如果'請什麼? –

+0

什麼'if'?您的帖子不包含一個。 –

+0

你「也看到了人們所做的」與你先看到的不一樣。兩個循環是***不是相同的。 –

回答

2

在C++中,運算符可以像函數一樣具有返回值。您是否可以使用表達式作爲條件完全取決於它們返回的內容。爲此,您必須查閱文檔。

在作業中:a = b,默認行爲是返回b的任何值;這是這樣的,像a = b = c = 5連鎖分配將工作。

該表達式相當於a = (b = (c = 5))c = 5將返回5,表達式變爲a = (b = 5),並且b = 5返回5,並且因此再次,表達式變爲a = 5,因此將5分配給a,bc

流對象可以直接作爲bool進行求值,因爲它是通過覆蓋的bool操作符的designed to do so

>>運營商針對流對象的情況下,運營商被覆蓋在類似返回流對象,所以:while (cin >> userInput)cin >> userInput回報cin,這將產生真或假。

這是一個很好的做法嗎?

我仍然是一名大學生,所以需要採取這些鹽。在流的情況下,我會說這是一個很好的做法,因爲這是一種衆所周知的模式。大多數人可以告訴你打算做什麼,而替代方案並不明確。

至於任務,我傾向於否,但這取決於誰在閱讀你的代碼和你在做什麼。如果你使用它太多,可能很難區分諸如if (userInput = 5)if (userInput == 5)之類的東西,從而很難找到錯誤。

0

你的例子是有點扭曲,但你的問題:

可我總是調理我的,而()上的一行代碼(如執行本主題中,條件在curr = curr-> next)?如果不是,邊緣情況是什麼?

while中的條件可以是任何可以隱式轉換爲bool的表達式。在你的例子中,「curr = curr->next」評估爲一個指針,它符合這個要求。

這是一個很好的做法嗎?

不會讓您感到困惑的代碼是最佳做法。

1

基本概念是while循環中的表達式必須可轉換爲bool

curr = curr->next表達式通過引用返回表達式的左側(請參閱chained assignments)。表達式的左邊是一個可轉換爲布爾值的指針。如果指針等於nullptr,那麼轉換後的布爾值將爲false,否則它將爲true。

表達式content >> outputStr返回對content流的引用。這就是爲什麼你可以鏈>>運營商,像這樣

cin >> a >> b; 

cin >> a返回cin對象的引用,因此表現的評價是這樣的

cin >> a; 
cin >> b; 

而且cin對象有定義的成員函數允許它可以轉換爲布爾表達式(http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool),所以你可以做這樣的事情

cin >> a; 
cout << "cin has failed (true/false) : " << std::boolalpha << static_cast<bool>(cin) << endl; 
// static_cast<bool>(cin) is the same as cin.(operator bool()) 
// if that syntax exists 

使用operator bool()方法將cin對象轉換爲布爾表達式。像if()語句或while()之類的布爾表達式中的某些內容被轉換爲布爾值。

我在想,我可以總是在執行一行代碼(本主題中的條件,curr = curr-> next)時執行條件while()。如果不是,邊緣情況是什麼?這是一個很好的做法嗎?

你可以這樣做,如果表達式可以轉換爲bool,而且在許多情況下,嵌入在一個循環中的表達是一個習慣使用的「轉換爲bool」功能。邊緣情況取決於表達式的實現細節。