【问题标题】:Pre-increment operation in CC中的预增操作
【发布时间】:2014-07-11 09:13:35
【问题描述】:

我刚刚开始编写 C 语言游戏编程教程的初学者指南。我对下面的代码有点困惑。

在主游戏中,OverTick 设置为零,然后我们就有了游戏结束时的情况

case GAME_OVER:
    printStatus("GAME OVER!!! The evil DarkLord was defeated");
    if (++gameOverTick % 100 == 0){
        status = PRINT_GAME_WELCOMESCREEN;  // go back to welcome screen
        gameOverTick = 0;           // reset gameOverTick
    }

我只想知道 ++ (pre-inc) 操作在 gameOverTick 上的作用。它是在检查 if 时将 gameOverTick 设置为 1,还是以某种方式将其设置为 0。我知道 post-inc ++ 是如何工作的,但这对我来说是一个新的。

谢谢

【问题讨论】:

  • gameOverTick 变为 100 时重置为 0。
  • 如果 gameOverTick 仅在此处修改(因此始终介于 0 和 100 之间),则除法 和 必须是重置变量的最昂贵方法当它达到某个上限时。
  • 和 post-inc 一样,只是在表达式中使用的值加上了1。在大多数情况下,这可以通过递增变量然后读取它来实现。

标签: c increment pre-increment


【解决方案1】:

这会在计算模数并完成比较之前将 gameOverTick 增加一。 (C 中一个好的经验法则是单一操作比二进制操作具有更紧密的绑定,并且计算超过逻辑操作。)它猜测这样做的目的是等待 100 个循环,直到它进入欢迎屏幕,因为 gameOverTick 只是重置如果它上升到 100。

【讨论】:

    【解决方案2】:

    您在 if 括号内编写的代码称为表达式,考虑到给定的表达式,表达式计算始终遵循运算符优先级规则

    1.++ 运算符具有最高优先级,因此 '++gameOverTick' 首先被评估为 '(gameOverTick = gameOverTick+1)'

    2.下一个优先级是'%'运算符,因此计算'(gameOverTick+1)%100'

    3.最后,最小优先级运算符是'==',因此将'=='运算符左侧获得的结果与右侧值进行比较。

    例子:

    -考虑 gameOverTick 值为 99

    -99 首先递增,即 99+1 = 100

    -比执行%操作即100%100 = 0

    -现在比较相等`,即 0 == 0 给出 1

    -表达式的求值结果为 1,因此它等于 if(1),表示为真。

    有关运算符优先级的更多信息,您可以参考此链接 http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

    【讨论】:

    • 您能解释一下评估表达式的基础吗?
    • 这个答案极具误导性。表达式求值顺序不遵循优先顺序。 考虑x = A() + B() * C()。这可以计算为a = A(); b = B(); c = C(); d = b * c; x = a + d; 或c = C(); a = A(); b = B(); d = b * c; x = a + d; 或b = B(); c = C(); d = b * c; a = A(); x = a + d; 或其他几种方式。 仅仅因为*的优先级高于+并不意味着时间的操作数在加法的操作数之前计算。 C 允许对子表达式的求值进行任何排序; C# 和 Java 需要从左到右的顺序。
    • 特别是您的回答是错误的,即++ 的副作用必须在计算% 之前发生。这是完全错误的。 ++ 的 值 必须在 % 之前计算,但 赋值 可以在序列点结束之前的任何时间发生。
    【解决方案3】:

    我们在这里有四个答案,它们都以同样的方式错了。让我确保你心里很清楚:那些告诉你运算符的优先级决定了子表达式计算结果产生副作用的顺序的人是完全错误的。在 C 中,计算子表达式的顺序不受优先级控制;它在很大程度上是未定义的。 (在 C# 和 Java 中,定义不是优先顺序,而是从左到右。)

    在这里的特定情况下,++ 操作的 值 必须在 % 发生之前计算,但与 ++ 关联的 赋值操作可以随时发生。在您的特定情况下,分配何时发生并不重要,但很容易构建它确实重要的情况。

    【讨论】:

      【解决方案4】:

      C 中的大多数表达式都有值;大多数表达式都有副作用。

      考虑下面的两个表达式

      /* a */ i++
      /* b */ ++i
      

      这两个表达式的副作用是增加i 的值(该更改仅在下一个序列点之后可用)。第一个表达式的值是i 在前一个序列点上的值;第二个表达式的值比i 在前一个序列点的值大一。

      【讨论】:

        猜你喜欢
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 2011-07-10
        • 1970-01-01
        • 2013-07-28
        相关资源
        最近更新 更多