周期中的前递增和后递增(对于/同时)有什么区别

What is the difference between pre-increment and post-increment in the cycle (for/while)?

本文关键字:同时 区别 对于 什么 周期      更新时间:2023-10-16

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

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

在这里,j在循环结束时包含旧i还是后递增i

由于语句 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.

取决于您如何使用它们。

  • i++创建一个副本,增加 i,然后返回副本(旧值(。
  • ++i增加 i,返回 i。

在您的示例中,一切都与速度有关。 ++i将比i++更快,因为它不会复制。

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

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

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

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

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

a = ++i;

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

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

a = i++;

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

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argp)
{
    int x = 5;
    printf("x=%dn", ++x);
    printf("x=%dn", x++);
    printf("x=%dn", x);
    return EXIT_SUCCESS;
}

程序输出:

x=6
x=6
x=7
在第一个 printf 语句中,x 在传递给 printf 之前递增,因此输出值 6,在第二个 x 中传递给 printf

(因此输出 6(然后递增,第三个 printf 语句只是通过再次输出 x 来显示前一条语句之后的后递增,现在的值为 7。

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

在许多情况下,后递增和前递增之间的区别确实很微妙。 Post Incremenet,又名 num++ ,首先创建一个 num 的副本,返回它,然后递增它。另一方面,预递增,又名 ++num ,首先计算,然后返回值。大多数现代编译器在循环中看到这一点时,通常会进行优化,主要是在使用后增量时,并且不使用返回的初始值。2 个增量之间最主要的区别,其中非常常见的是制造细微的错误,是在声明变量时,使用递增的值: 示例如下:

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,这并不总是有效,相当于预增量(。如果您使用正确的增量,将节省很多麻烦。

独立语句中使用前递增还是后递增并不重要,除了前递增效果是立竿见影的

//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