簡體   English   中英

有條件的逗號運算符

[英]Comma operator in a conditional

我已經閱讀了很多地方,但我真的無法理解條件中的指定行為。

我理解在賦值中它會計算第一個操作數,丟棄結果,然后計算第二個操作數。

但對於這段代碼,它應該做什么?

CPartFile* partfile = (CPartFile*)lParam;
ASSERT( partfile != NULL );
bool bDeleted = false;
if (partfile,bDeleted)
    partfile->PerformFileCompleteEnd(wParam);

IF中的partfile是一個不必要的參數,或者它有什么意義?

在這種情況下,它是一個不必要的表達式,可以在不改變代碼含義的情況下刪除。

逗號運算符執行第一個項的表達式,丟棄結果,然后將結果計算為最后一個表達式。

所以partfile,bDeleted將評估任何partfile ,丟棄該結果,然后評估並返回bDeleted

如果您需要評估具有副作用的內容(例如,調用方法),這將非常有用。 但在這種情況下,它沒用。

有關更多信息,請參閱Wikipedia:逗號運算符

bool bDeleted = false;
if (partfile,bDeleted)
    partfile->PerformFileCompleteEnd(wParam);

這里, if語句計算partfile,bDeleted,但bDelete始終為false,因此表達式無法運行。 關鍵問題是“那是什么意思?”。 可能的答案是有人暫時想要阻止partfile->PerformFileCompleteEnd(wParam); 來自運行的語句,可能是因為它導致了一些問題,或者他們希望確保以后的代碼報告錯誤,如果沒有執行該步驟。 為了讓他們記住代碼的原理,他們在那里留下了舊的“if(partfile)”邏輯,但添加了一個硬編碼的bDeleted變量來記錄partfile->Perform...邏輯已經被“刪除”了來自該計划。

暫時禁用此類代碼的更好方法可能是......

#if 0
    if (partfile)
        partfile->PerformFileCompleteEnd(wParam);
#endif

...雖然有時我也會嘗試記錄推理...

#ifndef DONT_BYPASS_FILE_COMPLETE_PROCESSING_DURING_DEBUGGING
    if (partfile)
        partfile->PerformFileCompleteEnd(wParam);
#endif

...要么...

if (partFile, !"FIXME remove this after debugging")
    partfile->PerformFileCompleteEnd(wParam);

最佳選擇取決於您的工具集和現有習慣(例如,某些編輯在反向視頻中突出顯示“FIXME”和“TODO”,因此很難錯過或灰顯#if 0塊;您可能有特定的字符串,您的源代碼控制簽入警告about;預處理器僅在調試版本中定義版本構建可以防止意外分發等)。

評估partfile,然后評估bDeleted並將其用作測試。 由於partfile的評估沒有任何副作用,因此從條件中刪除它不起作用。

逗號運算符是C / C ++的一個相當模糊的特性。 它不應該與初始化列表中的逗號混淆(即:int x,int y;),也不應與函數調用參數分離逗號(即:func(x,y))混淆。

逗號運算符只有一個目的:為程序員提供有保證的表達式求值順序。 對於C / C ++中的幾乎每個運算符,表達式的求值順序都是未定義的。 如果我寫

result = x + y;

其中x和y是子表達式,然后可以首先評估x或y。 我不知道哪個,這取決於編譯器。 如果你寫的話

result = x,y;

評估順序由標准保證:左邊第一個。

當然,在現實世界的應用程序中使用它是非常有限的...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM