2011-11-16 74 views
7

我只是碰到了這一段代碼,這是否:C/C++語法 - 使用分隔語句,而不是;法律?

delete a, a = 0; 

它編譯和運行就好了。但是這不應該是:

delete a; 
a = 0; 

爲什麼在這種情況下使用允許分隔語句?

謝謝:)

+3

它被稱爲逗號運算符:http://www.cplusplus.com/doc/tutorial/operators/。 –

+2

這應該是一個答案,而不是評論。 – Mysticial

+0

當然,這裏的例子是C++,而不是C. :-) – ibid

回答

6

這是逗號運算符。它評估它的參數並返回第二個參數。

+0

@Mankarse:已經修復,謝謝。 –

5

這是逗號運算符。它可以用來分隔表達式,但不能用於聲明。

+0

您可以用逗號引入多個相同類型的聲明。 –

7

在C和C++中,大多數「語句」實際上是表達式。添加到表達式的分號使其成爲語句。或者,它允許(但幾乎總是不好的風格)用逗號運算符分隔副效應表達式:左邊表達式的副作用被評估(並且其值被丟棄),右邊的表達式被評估爲副作用評估其價值。

1

儘管可以編寫這樣的代碼,但它可能有點奇怪。

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); 

我不會沒有特別好的理由使用它,但它允許您從一個狀態,這可以方便調用任何功能。