2013-07-22 375 views
22

我有這個問題,當我不小心刪除了方法名稱。該代碼爲什麼這個C++代碼編譯?它有什麼作用?

bool bRet = MethodName(pData, pOutFilename); 

bool bRet = (pData, pOutFilename); 

但仍編譯的?這段代碼做了什麼?這是什麼意思?它似乎返回true,是否始終如此(即使pData爲空)?

歡迎任何想法!

+7

查看逗號運算符。與'pData相同; bool bRet = pOutFilename;' –

回答

37

它是

評估其第一操作數和丟棄結果,然後 評估第二個操作數,並返回該值(和類型)的"comma operator"

+3

對於「實際使用」,「if(condition)return fprintf(stderr,」Debug message \ n「),FALSE;'如果您想臨時添加調試消息而不必添加大括號。 –

+0

@RobertFisher有意思的是,它也可以是'i = DEBUG_VALUE,j;' –

+0

值得一提的是,'pOutFilename'的值隱式轉換爲'bool'。假設'pOutFilename'是一個指針,如果'pOutFilename'是一個空指針,結果是'false',否則'true'。 –

17

你的表達bool bRet = (pData, pOutFilename);是有效的表達式,它是等效於表達式bool bRet = pOutFilename;

bool bRet = (pData, pOutFilename);,第一表達pData進行評價時,則第二個表達式pOutFilename進行評價時,則第二個表達式的值指派給bRet(這是,運營商如何從左到右工作)。

閱讀:Comma Operator: ,

逗號運算,left-to-right associativity。用逗號分隔的兩個表達式 從左到右進行評估。左邊的操作數是 總是評估,並且在評估右邊的 操作數之前完成所有副作用。

要理解表達式中括號()的重要性,請考慮下面的示例。觀察在該示例中(I有C例程)的輸出:

int main() { 
    int i = 10, b = 20, c= 30; 
    i = b, c; // i = b 
    printf("%i\n", i); 

    i = (b, c); // i = c 
    printf("%i\n", i); 
} 

輸出:

20 
30 

要理解的輸出:look at precedence table,具有的優先級低於=。在你的表達式中,你用括號覆蓋了優先級。

+6

除非'pData'有副作用,我猜。 – Joey

+0

它可能只有它是一個宏 –

+0

@StefanoFalasca如果'pData'是未初始化的,可以解釋各種適用的標準,意思是'pData,pOutFilename'中的'pData'有時是未定義的行爲。如果'pData'是一個包含信號NaN的浮點變量,也可能發生一些情況,但我對此不甚瞭解。 –

4

其a , comma operator。如果你有一個這樣的表達:

i = (a, b);   

b將存入i

所以你的情況:

bRet = pOutFilename; 

pOutFilename將存入bRet