【问题标题】:I don't know about pre and post incrementation [closed]我不知道前后增量[关闭]
【发布时间】:2017-02-02 03:17:21
【问题描述】:

为什么结果是 12 而不是 13 所以我认为第一个 k/j 被评估为 0 那么 j-0 变成 7 那么 5 + 7 = 12 然后在评估任何东西结束时 12++ 所以答案应该是 13 但它的 12 如果有人能解释一下,我将不胜感激。

int i = 5,j = 7,k = 3;
    int result = i+++j-k/j;
    printf("%d",result);

【问题讨论】:

  • 答案是 5 加 7,因为您在后递增 i
  • 12++ 没有意义,因为12 不是变量。
  • “我不知道前后增量” - 所以了解它们! - youtube.com/watch?v=FkxFPJG5paw

标签: c increment operator-keyword post-increment


【解决方案1】:

您已经被运算符优先级和整数除法所困扰。下面这个表达式中的所有内容,为了便于阅读而间隔开,都是使用整数数学完成的。

int result = i++ + j - k / j;

或者

int result = 5 + 7 - 3 / 7;

由于i++ 递增i 它被评估后,i 计算为 5,之后为 6。

除法的优先级高于加法或减法,所以实际上是这样的:

int result = 5 + 7 - (3 / 7);

所有整数数学都有小数部分被截断,所以3/7 为 0。

int result = 5 + 7 - 0;

这是你的 12 岁。

这就是为什么最好避免在较大的表达式中依赖自增运算符的前置或后置特性,它们会使表达式难以理解并且容易出错。或者单独使用它们作为i += 1 的简写,如for( int i = 0; i < something; i++ ),或者写成i += 1

【讨论】:

  • 所以 ++ 从不应用?
  • @noobPoopDeck 已应用,但它是针对i之后使用i。打印i,你会看到它是6。
【解决方案2】:

这个

int result = (i + j) - (k / j); i = i + 1;

匹配实际完成的操作。

【讨论】:

    【解决方案3】:
    i+++j-k/j   ==  i++ + j - k/j
    

    评估顺序

    1) k/j = 0
    3) i++ + j
       5++ + 7 = 12
    3) (i+++j)-k/j
        12-0 = 12
    

    现在 i 将增加到 6

    所以答案是 12 而不是 13。

    要获得 13 试试这个

    ++i+j-k/j;
    

    【讨论】:

    • 同等优先级的操作通常从左到右进行(此规则有几个例外)。
    • 您的“评估订单”是可能的订单,但不能保证,例如i + j 可能在 k / j 之前被评估
    • @JohnHascall 我认为您将关联性与评估顺序混为一谈。 f() - g() - h() 是左关联的,但函数可以按任意顺序调用
    • @M.M 我认为 / 的优先级高于 + 所以 k/j 应该首先评估。之后它应该从左到右。我改变了我的解决方案。
    • @Avi 您将优先级与评估顺序混为一谈
    猜你喜欢
    • 2014-01-25
    • 2013-12-30
    • 1970-01-01
    • 2014-02-16
    • 2022-11-04
    • 2011-09-18
    • 2012-09-15
    • 2015-02-17
    相关资源
    最近更新 更多