繁体   English   中英

为什么 ++i, i++ 在 for 循环中是一样的?

[英]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 循环不打印的原因是因为printfi++/++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_MAXint ,则n+1具有未定义的行为。 编写此循环的一种更安全的方法是:

for (int i = 1; i <= n; i++) {
    sum = sum + i;
}

但是<=运算符在nINT_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM