【问题标题】:C Increment Operator Explanation [duplicate]C增量运算符解释[重复]
【发布时间】:2017-07-06 11:16:37
【问题描述】:

在执行这条 C 命令时,num 的输出是 7。我原以为它是 6,谁能解释为什么以及如何变成 7?

#include <stdio.h>

int main() {
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int i = 0, num = 0;
    num = a[++i + a[++i]] + a[++i];
    printf("%d ", i);
    printf("%d ", num);
    return 0;
}

【问题讨论】:

  • 这是未定义的行为 - 您不能在同一操作中两次修改同一变量。
  • 你不是在同一个小时内问过同样的问题吗? (当然,这次你的措辞好多了。:))

标签: c increment post-increment pre-increment sequence-points


【解决方案1】:

OS X 上的 llvm 给了我 6 和一个警告:

wi.c:5:8: warning: multiple unsequenced modifications to 'i' [-Wunsequenced]

这表明我们正在查看未定义的行为。到目前为止,我还不清楚它在这里未定义的确切性质,但感觉有点无关紧要。

【讨论】:

  • This SO answer 解释并提供链接说明为什么这是未定义的行为,应该避免。
【解决方案2】:

这有点棘手,表达式:a[++i+a[++i]],涉及变量i的两次自增,结果是a[i + 2 + a[i + 2]],即a[0 + 2 + a[2]] = a[4] = 4,第二个操作数@987654325 @ 变为 a[3],等于 3,因此,最终答案是 7。换句话说,这是未定义的行为。

【讨论】:

    【解决方案3】:

    inum = a[++i + a[++i]] + a[++i]; 中的同一表达式内增加 3 倍

    这在 C 中具有未定义的行为。试图解释为什么它输出 76 或任何其他东西是一个有争议的问题。 未定义的行为可以是任何东西。

    【讨论】:

      【解决方案4】:
      i = 0;
      num = a[ ++i + a[++i]] + a[++i]
      

      将评估为

      num = a[1+ a[2]] + a[3]
      num = a[1 + 2] + a[3]
      num = a[3] + a[3]
      num = 3 + 3
      num = 6
      

      【讨论】:

      • @Antti Haapala 怎么会?
      • 查看重复的问题及其答案。
      • @Antti Haapala 是的,你是对的。谢谢你
      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 2023-03-26
      • 2012-11-23
      • 2010-12-29
      • 2012-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多