【问题标题】:what is difference between ++i and i+=1 from any point of view从任何角度来看 ++i 和 i+=1 有什么区别
【发布时间】:2013-08-27 13:07:31
【问题描述】:

这是来自 kn king 的 c 编程的一个问题:一种现代方法。看不懂他给出的解决方案:-

The expression ++i is equivalent to (i += 1). The value of both expressions is i after 
the increment has been performed.

我怎么理解这个?

【问题讨论】:

  • 哪一部分你不明白?
  • 假设如果i = 10,那么在i += 1之后,i变成11
  • 你错了++ii++,我举个例子。
  • @skp:你在问题的任何地方看到“i++”吗?

标签: c operators


【解决方案1】:

解决方案的意思是说没有没有区别,++i(i += 1) 具有相同的含义,无论i 碰巧是什么,也无论表达式的上下文如何。 i += 1 周围的括号确保即使上下文包含进一步的算术,等价也成立,例如 ++i * 3 等效于 (i += 1) * 3,但不等于 i += 1 * 3(等效于 i += 3)。

这不适用于i++,它具有相同的副作用(递增i),但周围表达式中的值不同——i 在递增之前的值。

【讨论】:

  • 但是i++ + 1 总是等价于++ii+=1。 :-)
  • 运算符签名相同。他们都返回,例如整数&。
  • @user2672165:C 中没有 int& 这样的东西。
  • C 中确实没有引用类型,但该表达式将返回一个 int 类型的 L 值,其存储由变量 i 命名。
  • @Novelocrat No. ++ii++ 不是 C 中的左值。您可能会再次想到 C++。 C 标准不擅长明确定义左值,所以我不会提供参考,但请询问任何 C 编译器。
【解决方案2】:

++i 是前置自增运算符。它在设置和返回值之前递增i(显然是i + 1)。

现在,i++ 是后自增运算符。在评估它出现的整个指令后,它会增加 i

例子:

int i = 0;
std::cout << ++i << std::endl; /* you get 1 here */
std::cout << i++ << std::endl; /* you still get 1 here */
std::cout << i << std::endl;   /* you get 2 here */

【讨论】:

  • 问题被标记为C,而不是C++
  • 而且问题不涉及后增量。
  • 更重要的是,这个答案中的“之前”和“之后”这两个词并不能反映 C 中前后增量的实际情况(也可能不在 C++ 中)。 i++ 计算为i 的最后一个值,并在最后一个和下一个序列点之间的任何时间递增i,并且不允许程序尝试观察何时。
【解决方案3】:
i = 10
printf("%d", i++);

将打印 10,其中为

printf("%d", ++i);

将打印 11

X = i++可以这样认为

X = i
i = i + 1

X = ++i 在哪里

i = i + 1
X = i

所以,

printf ("%d", ++i); 

相同
printf ("%d", i += 1);

但不是

printf ("%d", i++);

尽管在这三个语句中的任何一个之后i 的值都是相同的。

【讨论】:

    【解决方案4】:

    我认为它们完全一样。有一件事可能很有趣。 ++i 等于 (i+=1) 但不等于 i+=1;不同之处在于支架。因为 i += 1 可能取决于上下文并且会有不同的解释。

    【讨论】:

      【解决方案5】:

      在没有赋值的正常操作中:

      ++i 和 i++

      增加1中的变量。在伪汇编中,两个代码都是:

      inc i
      

      但是如果你给值赋值,++ 的顺序是相关的:

      x = i++

      生产:

      mov x, i
      inc i
      

      x = ++i

      生产:

      inc i
      mov x, i
      

      在以下情况下: i += 1

      它会产生:

      add i,1
      

      但由于编译器会优化代码,它也会在这种情况下生成:

      inc i
      

      【讨论】:

        【解决方案6】:

        到目前为止尚未提出的一个区别是代码的可读性。大部分循环使用递增一,常见的做法是在移动到下一个元素/索引递增 1 时使用 i++/++i。

        通常 i+= 仅在增量不是 1 时用于这些情况。将其用于正常增量不会有危险,但会导致理解上的轻微障碍并使代码看起来不寻常。

        【讨论】:

          【解决方案7】:

          两者的区别是: ++ 是一元运算符,而 + 是二元运算符.... 如果我们考虑执行时间: i++ is more faster than i=i+1. 执行同一组代码的机器周期数不同,这就是循环总是首选 ++ 运算符的原因。 Refer to this thread for more info

          【讨论】:

            猜你喜欢
            • 2010-10-26
            • 1970-01-01
            • 2011-03-21
            • 2021-08-25
            • 2021-12-30
            相关资源
            最近更新 更多