C中的预增量操作

时间:2014-05-22 11:03:38

标签: c increment pre-increment

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

在主游戏时,将游戏提示设置为零,然后我们就有一个游戏结束时的情况

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 ++是如何工作的,但对我来说这是一个新的。

由于

4 个答案:

答案 0 :(得分:12)

我们在这里得到了四个答案,但他们都以同样的方式出错了。让我确保你的想法非常清楚:告诉你运算符优先级的人确定由于计算子表达式而产生副作用的顺序是错误的。在C中,计算子表达式的顺序不受优先级控制;它很大程度上是未定义的。 (在C#和Java中,定义不是优先顺序,而是从左到右。)

在此处的特定情况下,++操作的必须在%发生之前计算,但赋值与之关联++操作可以随时进行。在您的特定情况下,分配发生时并不重要,但很容易构建 重要的案例。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

考虑以下两个表达式

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

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

答案 3 :(得分:-8)

您在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