繁体   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