代码之家  ›  专栏  ›  技术社区  ›  paulm

C++逗号运算符混淆

c++
  •  0
  • paulm  · 技术社区  · 6 年前

    类似问题:

    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 c3030将导致bsholloadingicon设置为true。是否有可能将其设置为真,也将变为真(整体上,如果表达式),从而也被设置为假?

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

    2 回复  |  直到 6 年前
        1
  •  5
  •   David Schwartz    6 年前

    C++只计算布尔值,或者如果需要的话。所以如果 sCurrentLevelId_5C30303 0 16 ,最后一条语句永远不会被计算。

    如果 (bShowLoadingIcon = TRUE, sCurrentLevelId_5C3030 == -1) 是否得到评估,它首先设置 bShowLoadingIcon TRUE 然后对 sCurrentLevelId_5C3030 == -1 . 如果那是真的,那么 BsHowloadingCon公司 只会回到 FALSE .

    综上所述, BsHowloadingCon公司 设置为 错误的 . 那么如果 sCurrentLevelId_5C3030 既不是 也不 十六 然后 BsHowloadingCon公司 设置为 真的 ,仅当 当前版本 -1 .

    所以,更简单地说, BsHowloadingCon公司 设置为 真的 如果 当前版本 既不是 也不 十六 一直保持这种状态 sCurrentLevelId_5C303030 不是 - 1 .

    相当于:

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

    或者,如果您愿意:

    BOOL bShowLoadingIcon = (
        (sCurrentLevelId_5C3030 == 0) ||
        (sCurrentLevelId_5C3030 == 16) ||
        (sCurrentLevelId_5C3030 == -1)) ? FALSE : TRUE;
    
        2
  •  3
  •   1201ProgramAlarm    6 年前

    在C++中,逗号运算符( statementX, statementY )第一次执行 statementX 然后 statementY . 表达式保存第二条语句的值。

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