我有這個問題,當我不小心刪除了方法名稱。該代碼爲什麼這個C++代碼編譯?它有什麼作用?
bool bRet = MethodName(pData, pOutFilename);
去
bool bRet = (pData, pOutFilename);
但仍編譯的?這段代碼做了什麼?這是什麼意思?它似乎返回true,是否始終如此(即使pData爲空)?
歡迎任何想法!
我有這個問題,當我不小心刪除了方法名稱。該代碼爲什麼這個C++代碼編譯?它有什麼作用?
bool bRet = MethodName(pData, pOutFilename);
去
bool bRet = (pData, pOutFilename);
但仍編譯的?這段代碼做了什麼?這是什麼意思?它似乎返回true,是否始終如此(即使pData爲空)?
歡迎任何想法!
它是
評估其第一操作數和丟棄結果,然後 評估第二個操作數,並返回該值(和類型)的"comma operator"。
對於「實際使用」,「if(condition)return fprintf(stderr,」Debug message \ n「),FALSE;'如果您想臨時添加調試消息而不必添加大括號。 –
@RobertFisher有意思的是,它也可以是'i = DEBUG_VALUE,j;' –
值得一提的是,'pOutFilename'的值隱式轉換爲'bool'。假設'pOutFilename'是一個指針,如果'pOutFilename'是一個空指針,結果是'false',否則'true'。 –
你的表達bool bRet = (pData, pOutFilename);
是有效的表達式,它是等效於表達式bool bRet = pOutFilename;
在bool bRet = (pData, pOutFilename);
,第一表達pData
進行評價時,則第二個表達式pOutFilename
進行評價時,則第二個表達式的值指派給bRet
(這是,
運營商如何從左到右工作)。
逗號運算
,
有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,
具有的優先級低於=
。在你的表達式中,你用括號覆蓋了優先級。
除非'pData'有副作用,我猜。 – Joey
它可能只有它是一個宏 –
@StefanoFalasca如果'pData'是未初始化的,可以解釋各種適用的標準,意思是'pData,pOutFilename'中的'pData'有時是未定義的行爲。如果'pData'是一個包含信號NaN的浮點變量,也可能發生一些情況,但我對此不甚瞭解。 –
其a ,
comma operator。如果你有一個這樣的表達:
i = (a, b);
b
將存入i
。
所以你的情況:
bRet = pOutFilename;
pOutFilename
將存入bRet
。
查看逗號運算符。與'pData相同; bool bRet = pOutFilename;' –