20

for我的兴趣在于和while循环之间的区别。我知道使用后增量值然后递增,并且操作返回一个常量前增量。

while (true) {
    //...
    i++;
    int j = i;
}

在这里,将包含循环结束时的ji增量或后增量?i

4

8 回答 8

49

由于语句 i++;在您的示例中结束,因此无论您使用前增量还是后增量都没有区别。

当您使用结果时会出现差异:

int j = i++; // i will contain i_old + 1, j will contain the i_old.

对比:

int j = ++i; // i and j will both contain i_old + 1.
于 2013-06-28T14:28:46.187 回答
45

取决于你如何使用它们。

  • i++制作一个副本,增加 i,并返回副本(旧值)。
  • ++i增加 i,并返回 i。

在您的示例中,这完全与速度有关。++i会比i++因为它不制作副本要快。

但是,编译器可能会将其优化掉,因为您没有在示例中存储增量运算符的返回值,但这仅适用于基本类型,如int.

于 2013-06-28T14:29:00.567 回答
24

理解的基本答案。递增运算符的工作方式如下:

// ++i
function pre_increment(i) {
    i += 1;
    return i;
}
// i++
function post_increment(i) {
    copy = i;
    i += 1;
    return copy;
}

当一个好的编译器检测到返回的值不会被使用时,它i++会自动替换为。++i

于 2015-12-10T09:30:39.790 回答
6

在预增量中,初始值首先递增,然后在表达式中使用。

a = ++i;

在此示例中,假设变量的i值为 5。那么变量的值a将是 6,因为在i表达式中使用它之前会修改 的值。

在后增量中,值首先在表达式中使用,然后递增。

a = i++;

在此示例中,假设变量的i值为 5。那么变量的值a将是 5,因为i只有在将值 5 分配给 后才会增加 的值a

于 2013-06-28T14:58:45.240 回答
5
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argp)
{
    int x = 5;

    printf("x=%d\n", ++x);
    printf("x=%d\n", x++);
    printf("x=%d\n", x);

    return EXIT_SUCCESS;
}

程序输出:

x=6
x=6
x=7

在第一个 printf 语句中,x 在传递给 printf 之前递增,因此输出值 6,在第二个 x 传递给 printf(所以输出 6)然后递增,第三个 printf 语句仅显示前一个后递增通过再次输出 x 现在的值 7 来声明。

于 2014-12-13T16:18:46.073 回答
2

i++ 使用 i 的值然后递增它,但 ++i 在使用它之前递增 i 的值。

于 2018-03-27T23:00:34.373 回答
0

在独立语句中使用前置增量还是后置增量都没有关系,除了前置增量,效果是即时的

//an example will make it more clear:


int n=1;
printf("%d",n);
printf("%d",++n);// try changing it to n++(you'll get to know what's going on)

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

输出:123

于 2018-11-09T22:20:04.797 回答
0

在许多情况下,后增量和前增量之间的差异确实很微妙。post incremenet,又名num++,首先创建 的副本num,将其返回,然后将其递增。另一方面,预增量 aka ++num,首先计算,然后返回值。大多数现代编译器,当在循环中看到这一点时,通常会优化,主要是在使用后增量时,并且不使用返回的初始值。两个增量之间的最大区别(通常会产生细微的错误)是在声明具有增量值的变量时:示例如下:

int num = 5;
int num2 = ++num; //Here, first num is incremented, 
                  //then made 6, and that value is stored in num2;

另一个例子:

int num = 5;
int num2 = num++; //Here, num is first returned, (unfortunately?), and then 
                  //incremented. This is useful for some cases.

我想说的最后一件事是小心增量。声明变量时,请确保使用正确的增量,或者只写出整个内容(num2 = num + 1这并不总是有效,相​​当于预增量)。如果您使用正确的增量,将会省去很多麻烦。

于 2016-08-05T17:49:34.973 回答