从任何角度来看 ++i 和 i+=1 有啥区别

Posted

技术标签:

【中文标题】从任何角度来看 ++i 和 i+=1 有啥区别【英文标题】: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++”吗? 【参考方案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

【讨论】:

以上是关于从任何角度来看 ++i 和 i+=1 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

从底层的角度来看,Windows 中的命名管道和远程过程调用 (RPC) 有啥区别?

i++ 和 ++i 有啥区别?

Ruby 中的方法和消息有啥区别? [关闭]

JVM笔记----从JVM角度浅谈 i++ 和 ++i 的区别

这两者有啥区别……?

PHP中的++$i和$i++有啥区别?