2011-04-12 103 views
2

下面的行在for循環中。如果該方法失敗,則需要中斷。 CATEGORY_1是一個枚舉。我將這個枚舉作爲一個新的參數添加到AddToList方法的默認值。如果你仔細看下面,我實際上犯了一個錯誤,把逗號和枚舉放在函數的參數列表之外。這與VS2010編譯完美無瑕。所以我很難找到默認值是通過該參數而不是CATEGORY_1傳遞的。 有誰知道爲什麼會成功?爲什麼這個代碼在VS編譯? (「額外」逗號)

if (! AddToList(obj1, (unsigned int) Val), CATEGORY_1) 
{ 
    break; 
} 

回答

7

在C++中,逗號不僅僅是分隔符;它也可以是一個操作員。這個逗號是一個操作符。逗號運算符評估第一個表達式,放棄結果,然後評估第二個表達式並得出結果。

!AddToList(obj1, (unsigned int) Val) , CATEGORY_1 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ 
First expression      Second expression 

[當然,逗號運算符,像大多數其他的運營商,可以被重載,並且如果過載這裏所使用的,語義可以是不同的。這是內置逗號運算符的行爲。]

+0

非操作符是否應用? – 2011-04-12 01:41:16

+0

要清楚的是,James引用的第一個表達式是'!AddToList(obj1,(unsigned int)Val)',第二個表達式是'CATEGORY_1' – 2011-04-12 01:41:54

+0

@Sriram Subramanian:不,逗號運算符的運算符最低運營商。所以,不會適用於'AddToList',而不適用於'CATEGORY_1'。 – ildjarn 2011-04-12 01:42:21

1

逗號運算符將簡單地放棄第一個表達式的結果並評估第二個表達式的值。所以在這種情況下,如果bool(CATEGORY_1) == true那麼if永遠不會評估;相反,如果bool(CATEGORY_1) == false那麼if將始終評估。在任何情況下,它會返回什麼AddToList