有条件的逗号运算符

时间:2011-01-24 04:41:04

标签: c++ c comma-operator

我在很多地方读过,但我真的无法理解条件中的指定行为。

我理解在赋值中它会计算第一个操作数,丢弃结果,然后计算第二个操作数。

但对于这段代码,它应该做什么?

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

IF中的partfile是一个不必要的参数,还是有任何意义?

5 个答案:

答案 0 :(得分:9)

在这种情况下,它是一个不必要的表达式,可以在不改变代码含义的情况下删除。

答案 1 :(得分:4)

逗号运算符执行第一项的表达式,丢弃结果,然后将结果计算为最后一个表达式。

所以partfile,bDeleted会评估partfile的所有内容,放弃该结果,然后评估并返回bDeleted

如果您需要评估具有副作用的内容(例如,调用方法),这将非常有用。但在这种情况下,它没用了。

有关详细信息,请参阅Wikipedia: Comma operator

答案 2 :(得分:2)

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块;您可能有特定的字符串来源 - control checkin警告;预处理器仅在调试版本中定义版本构建可以防止意外分发等。)。

答案 3 :(得分:1)

评估

partfile,然后评估bDeleted并将其用作测试。由于partfile的评估没有任何副作用,将其从条件中删除无效。

答案 4 :(得分:1)

逗号运算符是C / C ++的一个相当模糊的特性。它不应该与初始化列表中的逗号混淆(即:int x,int y;),也不应与函数调用参数分离逗号混淆(即:func(x,y))。

逗号运算符只有一个目的:为程序员提供有保证的表达式求值顺序。对于C / C ++中的几乎所有运算符,表达式的求值顺序都是未定义的。如果我写

result = x + y;

其中x和y是子表达式,然后可以首先评估x或y。我不知道哪个,这取决于编译器。如果你写了

result = x,y;

评估顺序由标准保证:左先。

当然,在现实世界的应用程序中使用它是非常有限的......