从任何角度来看 ++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
。
你错了++i
≠i++
,我举个例子。
@skp:你在问题的任何地方看到“i++”吗?
【参考方案1】:
解决方案的意思是说没有没有区别,++i
与(i += 1)
具有相同的含义,无论i
碰巧是什么,也无论表达式的上下文如何。 i += 1
周围的括号确保即使上下文包含进一步的算术,等价也成立,例如 ++i * 3
等效于 (i += 1) * 3
,但不等于 i += 1 * 3
(等效于 i += 3
)。
这不适用于i++
,它具有相同的副作用(递增i
),但周围表达式中的值不同——i
在递增之前的值。
【讨论】:
但是i++ + 1
总是等价于++i
和i+=1
。 :-)
运算符签名相同。他们都返回,例如整数&。
@user2672165:C 中没有 int&
这样的东西。
C 中确实没有引用类型,但该表达式将返回一个 int
类型的 L 值,其存储由变量 i
命名。
@Novelocrat No. ++i
和 i++
不是 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) 有啥区别?