【问题标题】:Does ++i perform the same task as i++ +1? [closed]++i 是否执行与 i++ +1 相同的任务? [关闭]
【发布时间】:2016-11-04 06:07:57
【问题描述】:

假设我将代码分配给 ASCII 字符,其中代码 1 分配给 ASCII 值 0、NUL 字符等等。我正在迭代地执行此操作,目前使用 i+++1,即:

for (int i = 0; i < 256; i++) {
    // assign code i++ +1
    arr[i].code = i++ +1;
}

如果我用 ++i 代替,就够了吗?

【问题讨论】:

  • 请出示实际代码;不是空循环中的模糊评论。
  • @Danh 绝对不是。对于奖励积分,您可以与 preincrement (++i+1) 进行比较和对比。
  • @EdwardThomson 我知道(++i+1) 是有效的声明,但我不知道最大咀嚼策略。我唯一能找到的是这个链接stackoverflow.com/questions/7233317/…,上面写着ANSI 标准规定,是不是用ISO C 写的?
  • @Danh 是的,它在 C11 规范第 6.4 节第 4 段中:“如果输入流已被解析为预处理标记,直到给定字符,则下一个预处理标记是最长的可以构成预处理标记的字符序列。” 第 6 段中给出了一个示例:“程序片段 x+++++y 被解析为 x ++ ++ + y,这违反了对增量运算符的约束,甚至尽管解析 x ++ + ++ y 可能会产生正确的表达式。"

标签: c


【解决方案1】:

这可能会有所帮助

y = i+++x -> 将 x 添加到 i 的当前值并将结果分配给 y,然后递增 i 的值

y = ++1 -> 将 i 加 1 并将结果分配给 y

【讨论】:

    【解决方案2】:

    我更愿意写成i++ + 1。但是是的,++ii+++1 具有相同的效果和价值。

    不过,后者在逻辑上做了更多的工作来得出结果:它保留i 的旧值,递增i,将旧值加一并产生总和作为结果。预增量运算符只是增加 i 并将其新值用作结果。

    在给定优化编译器的情况下,从技术上讲,两者都应该编译成基本相同的代码。

    【讨论】:

      【解决方案3】:

      是的。它们是一样的。

      ++ 的边界比 + 更紧,因此表达式从左到右计算为

      s = (i++) + 1
      

      可以进一步扩展为

      s = i + 1
      i = i + 1
      

      另一方面,s = ++i 执行相同的任务。可以展开为

      i = i + 1
      s = i
      

      最好使用第二个版本,因为它更具可读性和可扩展性。但我认为速度上不会有差异。

      【讨论】:

        【解决方案4】:

        是的,i+++1 和 ++i 都会计算出 i 加 1 的值,并且都会让 i 加 1。

        这是一种奇怪的做法,只是这样做有什么问题吗:

        for (int i = 1; i < 256; i += 2)
        

        我相信,以后阅读您的代码的任何人都会更喜欢后者。

        【讨论】:

          猜你喜欢
          • 2021-02-10
          • 1970-01-01
          • 1970-01-01
          • 2020-05-24
          • 1970-01-01
          • 2020-06-16
          • 1970-01-01
          • 2015-08-17
          • 1970-01-01
          相关资源
          最近更新 更多