我只是碰到了這一段代碼,這是否:C/C++語法 - 使用分隔語句,而不是;法律?
delete a, a = 0;
它編譯和運行就好了。但是這不應該是:
delete a;
a = 0;
爲什麼在這種情況下使用允許分隔語句?
謝謝:)
我只是碰到了這一段代碼,這是否:C/C++語法 - 使用分隔語句,而不是;法律?
delete a, a = 0;
它編譯和運行就好了。但是這不應該是:
delete a;
a = 0;
爲什麼在這種情況下使用允許分隔語句?
謝謝:)
這是逗號運算符。它評估它的參數並返回第二個參數。
@Mankarse:已經修復,謝謝。 –
這是逗號運算符。它可以用來分隔表達式,但不能用於聲明。
您可以用逗號引入多個相同類型的聲明。 –
在C和C++中,大多數「語句」實際上是表達式。添加到表達式的分號使其成爲語句。或者,它允許(但幾乎總是不好的風格)用逗號運算符分隔副效應表達式:左邊表達式的副作用被評估(並且其值被丟棄),右邊的表達式被評估爲副作用評估其價值。
即comma operator。 MSDN文章是here。並看看this問題來了解它是如何工作的。
儘管可以編寫這樣的代碼,但它可能有點奇怪。
struct T {
bool check() const;
void fix();
};
現在你想通過在結構中的一切迭代和運行檢查就可以了,然後調用修復,如果檢查返回false:如果你有一個struct T
如下稍微更現實的用例是。這樣做的簡單方法是
for (list<T>::iterator it = mylist.begin(); it < mylist.end(); ++it)
if (!it->check())
it->fix();
讓我們假裝你想寫得儘可能簡短。 fix()
返回void意味着你不能把它放在條件中。然而,使用逗號操作符可以解決這個問題:
for (auto it = mylist.begin(); it != mylist.end() && (it->check() || (it->fix(), true)); ++it);
我不會沒有特別好的理由使用它,但它允許您從一個狀態,這可以方便調用任何功能。
它被稱爲逗號運算符:http://www.cplusplus.com/doc/tutorial/operators/。 –
這應該是一個答案,而不是評論。 – Mysticial
當然,這裏的例子是C++,而不是C. :-) – ibid