5

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

我知道在赋值中它评估第一个操作数,丢弃结果,然后评估第二个操作数。

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

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

IF 中的零件文件是不必要的参数,还是有任何意义?

4

5 回答 5

9

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

于 2011-01-24T04:43:14.093 回答
4

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

所以partfile,bDeleted会评估任何partfile会,丢弃该结果,然后评估并返回bDeleted

如果您需要评估具有副作用的事物(例如,调用方法),它会很有用。但是,在这种情况下,它是没有用的。

有关更多信息,请参阅Wikipedia:逗号运算符

于 2011-01-24T04:50:45.243 回答
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 块;您的源代码管理检查警告可能有特定字符串about; 预处理器仅在调试与发布版本中定义可以防止意外分发等)。

于 2011-01-24T05:55:05.660 回答
1

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

于 2011-01-24T04:53:02.307 回答
1

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

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

结果 = x + y;

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

结果 = x, y;

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

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

于 2011-01-24T08:49:13.280 回答