![](/img/trans.png)
[英]Why is there any difference between “++i” and “i++” in a for loop?
[英]Why ++i, i++ are the same in for loop?
for (int i = 0; i < n+1; ++i)
{
sum = sum + i;
}
for (int i = 0; i < n+1; i++)
{
sum = sum + i;
}
两段因 function 调用参数中的 ++i 和 i++ 而不同。
但它就像 i 只以 0 开头一样工作。为什么甚至 ++i 也以 0 开头?
这两个片段之间绝对没有区别。 i++
与++i
仅在与同一表达式中的其他运算符混合时才有意义。 大多数时候这是一个坏主意,因为i++
/ ++i
带有副作用。
一个通用for
循环,如
for (a; b; c)
{
d
}
相当于
{
a;
while (b)
{
d;
c;
}
}
请注意“增量”表达式c
是如何位于循环体的主语句之后的。
对于您的循环,这意味着它们将等效于:
{
int i = 0;
while (i < n+1)
{
sum = sum + i;
i++; // or ++i
}
}
由于i
的增量直到您计算sum
之后才会发生,因此循环之间没有实际差异。 两者都会导致完全相同的结果。
附带说明:请记住在循环之前将sum
显式初始化为零,否则它可能具有不确定的值(可能被视为垃圾)。
您发布的两个 for 循环的行为完全相同。 它们相等的原因,也回答了为什么两个循环都从0
开始的问题,是增量( i++
或++i
)仅在 {} 中的{expression}执行后发生,并且在每次执行后发生.
您的代码将产生相同的结果。
下面的代码会产生不同的结果。
int i = 0;
while (i < 5) {
printf("%d\n", ++i);
}
// 1
// 2
// 3
// 4
// 5
i = 0;
while (i < 5) {
printf("%d\n", i++);
}
// 0
// 1
// 2
// 3
// 4
在我的示例中,底部 for 循环打印出 0 而顶部 for 循环不打印的原因是因为printf
和i++/++i
形成一个组合表达式,其中顶部i
递增,然后从 memory 访问,而在底部循环i
是从 memory 访问,然后递增。
这些for
循环的最后一个子句中的i++
和++i
表达式都将i
递增作为副作用,并且由于未使用表达式的值,因此它们具有完全相同的效果,即副作用。
以下是其他替代方法,它们的行为相同并且应该产生相同的代码:
for (int i = 0; i < n+1; i += 1) {
sum = sum + i;
}
和
for (int i = 0; i < n+1; i = i + 1) {
sum = sum + i;
}
但是请注意,如果n
是值为INT_MAX
的int
,则n+1
具有未定义的行为。 编写此循环的一种更安全的方法是:
for (int i = 1; i <= n; i++) {
sum = sum + i;
}
但是<=
运算符在n
为INT_MAX
时存在相同的问题:当i
达到INT_MAX
时,未定义的行为将发生在i++
部分...
这是避免这种极端情况的替代方法:
if (n > 0) {
for (int i = 1; i < n; i++) {
sum = sum + i;
}
sum = sum + n;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.