Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 条件语句中的逗号运算符_C++_C_Comma Operator - Fatal编程技术网

C++ 条件语句中的逗号运算符

C++ 条件语句中的逗号运算符,c++,c,comma-operator,C++,C,Comma Operator,我在很多地方都读过,但我真的不能理解条件句中指定的行为 我知道在赋值中,它先计算第一个操作数,放弃结果,然后计算第二个操作数 但是对于这个代码,它应该做什么呢 CPartFile* partfile = (CPartFile*)lParam; ASSERT( partfile != NULL ); bool bDeleted = false; if (partfile,bDeleted) partfile->PerformFileCompleteEnd(wParam); IF中的

我在很多地方都读过,但我真的不能理解条件句中指定的行为

我知道在赋值中,它先计算第一个操作数,放弃结果,然后计算第二个操作数

但是对于这个代码,它应该做什么呢

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

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

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

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

因此,
partfile,b删除
将计算
partfile
将要计算的内容,放弃该结果,然后计算并返回
b删除

如果您需要评估具有副作用的内容(例如,调用方法),那么它非常有用。不过,在这种情况下,它是无用的


有关详细信息,请参见评估零件文件,然后评估删除的零件并将其用作测试。由于对partfile的求值没有任何副作用,因此将其从条件中删除不会产生任何效果

bool bDeleted = false;
if (partfile,bDeleted)
    partfile->PerformFileCompleteEnd(wParam);
这里,
if
语句计算partfile,bDelete,但bDelete总是false,因此表达式无法运行。关键问题是“这是怎么回事?”。可能的答案是有人暂时想要阻止
partfile->PerformFileCompleteEnd(wParam)语句无法运行,可能是因为它导致了一些问题,或者他们希望确保在未执行该步骤的情况下,稍后的代码正确报告错误。为了让他们记住以前的代码,他们保留了旧的“if(partfile)”逻辑,但添加了一个硬编码的b删除变量,以记录
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”,因此很难错过或灰显#如果0个块;您可能有源代码管理签入警告的特定字符串;预处理器仅在调试版本与发布版本中定义可以防止意外分发等).

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

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

结果=x+y

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

结果=x,y

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


当然,它在现实世界中的应用非常有限……

也许这会有所帮助:一种可能性是,编码者的意思是
if(partfile&&bDeleted)
,其他一些编程语言确实有
if a,b
的意思是“if a and b”,你可以把它倒过来,partfile将被计算并忽略,bDeleted将被计算并返回。@helloworld922:如果为true,将修复此问题。逗号运算符不会计算n-1项。C/C++中的每个运算符都是一元运算符或二进制运算符。如果在一行上放置多个逗号运算符,它将计算第一项,放弃它,计算第二项,并将第二项用作该行上下一个逗号运算符的操作数。当然,结果将与评估n-1项的结果相同,但要理解原因,您需要知道中间发生了什么,才能得到最后一项。好的一点,我认为a、b、c是一个术语(这是正确的措辞吗?),但这不是真的,因为有两个逗号运算符。修复了逗号运算符可重写的问题。也许使用它可能会改变左手表达式的状态。@但对于两种基本类型(本例中为指针和布尔),不能重载它;必须至少有一个操作数具有类类型