C ++逗号运算符混淆

时间:2018-08-01 22:30:57

标签: c++

类似的问题:

How is the comma operator being used here?

BOOL bShowLoadingIcon = FALSE;
if (sCurrentLevelId_5C3030 == 0 || sCurrentLevelId_5C3030 == 16 || (bShowLoadingIcon = TRUE, sCurrentLevelId_5C3030 == -1))
{
    bShowLoadingIcon = FALSE;
}

在上面的代码示例中,sCurrentLevelId_5C3030的什么值/范围会导致bShowLoadingIcon设置为TRUE。

是否有可能将其设置为TRUE并同时也变为true(如果为表达式则全部设置),然后又设置回FALSE?

我不知道(bShowLoadingIcon = TRUE, sCurrentLevelId_5C3030 == -1)在做什么。

2 个答案:

答案 0 :(得分:5)

C ++仅在需要时才计算布尔值OR。因此,如果sCurrentLevelId_5C30303016,则最后一条语句永远不会得到求值。

如果确实对(bShowLoadingIcon = TRUE, sCurrentLevelId_5C3030 == -1)进行了评估,它将首先将bShowLoadingIcon设置为TRUE,然后对sCurrentLevelId_5C3030 == -1的结果求值。如果是这样,那么bShowLoadingIcon就会重新设置为FALSE

因此,总而言之,bShowLoadingIcon被设置为FALSE。然后,如果sCurrentLevelId_5C3030既不是0也不是16,则bShowLoadingIcon被设置为TRUE,只有sCurrentLevelId_5C3030被设置为false -1

因此,更概括地说,如果bShowLoadingIcon既不是TRUE也不是sCurrentLevelId_5C3030,则0会被设置为16,并且只要{ {1}}不是sCurrentLevelId_5C303030

等效于:

-1

或者,如果您愿意:

BOOL bShowLoadingIcon = (
    (sCurrentLevelId_5C3030 != 0) &&
    (sCurrentLevelId_5C3030 != 16) &&
    (sCurrentLevelId_5C3030 != -1)) ? TRUE : FALSE:

答案 1 :(得分:3)

在C ++中,逗号运算符(statementX, statementY)首先执行statementX,然后执行statementY。该表达式保留第二条语句的值。

在您的代码中,为bShowLoadingIcon分配了值TRUE,然后C ++在if语句中检查的值是否为sCurrentLevelId_5C3030 == -1