++ i和i ++有什么区别?

c for-loop post-increment pre-increment

815893 观看

21回复

在C中,使用++i和之间有什么区别i++,哪些应该在for循环的增量块中使用?

作者: The.Anti.9 的来源 发布者: 2019 年 5 月 29 日

回应 (21)


911

决定
  • ++i将增加值的值i,然后返回递增的值。

     i = 1;
     j = ++i;
     (i is 2, j is 2)
    
  • i++将递增值的值i,但返回在i递增之前保持的原始值。

     i = 1;
     j = i++;
     (i is 2, j is 1)
    

对于一个for循环,要么工作。++i似乎更常见,也许是因为这是K&R中使用的

在任何情况下,遵循准则“宁可++ii++”,你会不会出问题。

有一对夫妇的关于效率的意见++ii++。在任何非学生项目编译器中,都没有性能差异。您可以通过查看生成的代码来验证这一点,这些代码是相同的。

效率问题很有意思......这是我尝试回答的问题: 在C中i ++和++ i之间是否存在性能差异?

正如On Freund所说,对于C ++对象来说它是不同的,因为它operator++()是一个函数,编译器无法知道如何优化临时对象的创建来保存中间值。

作者: Mark Harrison 发布者: 24.08.2008 05:23

148

i ++被称为Post Increment,++ i被称为Pre Increment。

i++

i++是增量后,因为它i在操作结束后将值增加1。

让我们看看以下示例:

int i = 1, j;
j = i++;

这里的价值j = 1但是i = 2。这里的值i将被分配给j第一个然后i将递增。

++i

++i是预增量,因为它i在操作之前将值增加1。这意味着j = i;将在之后执行i++

让我们看看以下示例:

int i = 1, j;
j = ++i;

这里的价值j = 2但是i = 2。这里的值iji 增加之后分配给i。同样++i将在之前执行j=i;

对于你应该在for循环的增量块中使用的问题 答案是,你可以使用任何一个..没关系。它将执行你的for循环相同的no。时间。

for(i=0; i<5; i++)
   printf("%d ",i);

for(i=0; i<5; ++i)
   printf("%d ",i);

两个循环都会产生相同的输出。即0 1 2 3 4

它只在你使用它的地方很重要。

for(i = 0; i<5;)
    printf("%d ",++i);

在这种情况下输出将是1 2 3 4 5

作者: Parag 发布者: 28.03.2012 05:54

33

请不要担心哪一个更快的“效率”(速度,真的)。这些天我们有编译器来处理这些事情。使用任何有意义的使用,在此基础上更清楚地显示您的意图。

作者: Andy Lester 发布者: 20.09.2008 05:06

28

++i 递增值,然后返回它。

i++ 返回值,然后递增它。

这是一个微妙的差异。

对于for循环,请使用++i,因为它稍快一些。i++将创建一个被丢弃的额外副本。

作者: Ryan Fox 发布者: 24.08.2008 05:21

21

i ++: - 在这种情况下,首先分配值,然后发生增量。

++ i: - 在这种情况下,首先完成增量,然后分配值

下面是图像可视化,这里也是一个很好的实用视频(http://www.youtube.com/watch?v=lrtcfgbUXm4),它演示了相同的内容。

在此输入图像描述

作者: Shivprasad Koirala 发布者: 25.07.2013 07:42

19

究其原因++i 可以是略快于i++是,i++可以要求i的值的本地副本,它得到递增之前,而++i从来不会。在某些情况下,如果可能的话,一些编译器会对其进行优化......但并非总是可行,并非所有编译器都这样做。

我尽量不要太依赖编译器优化,所以我会遵循Ryan Fox的建议:当我可以使用两者时,我会使用++i

作者: OysterD 发布者: 24.08.2008 06:00

11

使用任何一种的有效结果都是相同的。换句话说,循环在两个实例中都会做同样的事情。

在效率方面,选择i ++ over ++ i可能会受到惩罚。就语言规范而言,使用后增量运算符应该创建运算符所作用的值的额外副本。这可能是额外操作的来源。

但是,您应该考虑前面逻辑的两个主要问题。

  1. 现代编译器很棒。所有优秀的编译器都足够聪明,可以意识到它在for循环中看到了整数增量,并且它会将两种方法优化为相同的高效代码。如果使用后增量超过预增量实际上会导致程序运行时间变慢,那么您使用的是可怕的编译器。

  2. 就操作时间复杂性而言,这两种方法(即使实际执行副本)也是等效的。在循环内执行的指令数应该显着地增加增量操作中的操作数。因此,在任何有效大小的循环中,增量方法的代价将被循环体的执行大大掩盖。换句话说,你最好不要担心在循环中优化代码而不是增量。

在我看来,整个问题简单归结为一种风格偏好。如果您认为预增量更具可读性,那么请使用它。就个人而言,我更喜欢后加入,但这可能是因为在我对优化有所了解之前,这就是我所教授的内容。

这是过早优化的典型例子,这样的问题有可能让我们分散设计中的严重问题。然而,这仍然是一个很好的问题,因为在“最佳实践”中没有统一的使用或共识。

作者: dusktreader 发布者: 06.05.2011 09:36

9

他们都增加了数字。++ i相当于i = i + 1。

i ++和++我非常相似但不完全相同。两者都递增数字,但++ i在计算当前表达式之前递增数字,而i ++在计算表达式之后递增数字。

示例:

int i = 1;
int x = i++; //x is 1, i is 2
int y = ++i; //y is 3, i is 3
作者: Usman 发布者: 19.02.2018 05:04

4

++ i是预增量,另一个是后增量

i ++:获取元素然后递增它。
++ i:递增i然后返回元素

例:

int i = 0;
printf("i: %d\n", i);
printf("i++: %d\n", i++);
printf("++i: %d\n", ++i);

输出:

i: 0
i++: 0
++i: 2
作者: Scitech 发布者: 17.09.2013 12:23

4

++ i(前缀操作):递增然后赋值
(例如):int i = 5,int b = ++ i
在这种情况下,首先将6分配给b,然后增加到7,依此类推。

i ++(后缀操作):赋值然后递增值
(例如):int i = 5,int b = i ++
在这种情况下,首先将5分配给b,然后增加到6,依此类推。

for for循环:主要使用i ++,因为通常我们在递增for循环之前使用i的起始值。但是根据你的程序逻辑,它可能会有所不同。

作者: Anands23 发布者: 13.05.2016 05:50

3

我假设你现在理解语义上的差异(虽然老实说我想知道为什么人们会问'运算符X对于堆栈溢出的问题'而不是阅读,你知道,书或网络教程等等。

但无论如何,就使用哪一个而言,忽略性能问题,即使在C ++中也不太重要。这是您在决定使用哪个时应该使用的原则:

说出你在代码中的意思。

如果在语句中不需要value-before-increment,请不要使用运算符的那种形式。这是一个小问题,但除非你正在使用一个版本指南,禁止一个版本支持另一个版本(也就是一个骨头风格指南),你应该使用最准确表达你想要做的事情的形式。

QED,使用预增量版本:

for (int i = 0; i != X; ++i) ...
作者: Scott Urban 发布者: 04.08.2011 05:20

3

下面这个简单的C ++代码可以理解这种差异:

int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;
作者: IOstream 发布者: 12.09.2017 09:13

3

主要区别是

  • i ++ Post(增量后)和
  • ++ i Pre(增量前

    • 如果i =1 循环增加,则发布1,2,3,4,n
    • 如果i =1 循环递增,则为pre2,3,4,5,n
作者: Gopinath Kaliappan 发布者: 13.05.2016 06:00

2

简而言之:如果您不在函数中编写它们,++ i和i ++的工作方式相同。如果你使用类似函数(i ++)或函数(++ i)的东西,你可以看到差异。

函数(++ i)表示首先将i递增1,之后将此i放入具有新值的函数中。

function(i ++)表示首先将i加入到函数中,然后将i加1。

int i=4;
printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now
i=4;
printf("%d",pow(i++,2));//it prints 16 i is 5 now
作者: GokhanAvci 发布者: 22.08.2013 05:25

2

预先创建意味着在同一行上增加。后增量表示行执行后的增量。

int j=0;
System.out.println(j); //0
System.out.println(j++); //0. post-increment. It means after this line executes j increments.

int k=0;
System.out.println(k); //0
System.out.println(++k); //1. pre increment. It means it increments first and then the line executes

当OR,AND运算符出现时,它变得更有趣。

int m=0;
if((m == 0 || m++ == 0) && (m++ == 1)) { //false
/* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
System.out.println("post-increment "+m);
}

int n=0;
if((n == 0 || n++ == 0) && (++n == 1)) { //true
System.out.println("pre-increment "+n); //1
}

在数组中

        System.out.println("In Array");
        int[] a = { 55, 11, 15, 20, 25 } ;
        int ii, jj, kk = 1, mm;
        ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
        System.out.println(a[1]); //12

        jj = a[1]++; //12
        System.out.println(a[1]); //a[1] = 13

        mm = a[1];//13
        System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13

        for (int val: a) {
            System.out.print(" " +val); //55, 13, 15, 20, 25
        }

在C ++中/指针变量的预增量

#include <iostream>
using namespace std;

int main() {

    int x=10;
    int* p = &x;

    std::cout<<"address = "<<p<<"\n"; //prints address of x
    std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
    std::cout<<"address = "<<&x<<"\n"; //prints address of x

    std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
}
作者: Uddhav Gautam 发布者: 29.09.2017 04:49

2

以下C代码片段说明了前后增量和减量运算符之间的区别:

int i; int j;

//增加运算符

i = 1;

j = ++ i; //我现在是2,j也是2

j = i ++; //我现在是3,j是2

作者: Nihal Reddy 发布者: 01.10.2017 03:58

2

i ++和++ i

这个小代码可能有助于从与已发布的答案不同的角度可视化差异:

int i = 10, j = 10;

  printf ("i is %i \n", i);
  printf ("i++ is %i \n", i++);
  printf ("i is %i \n\n", i);

  printf ("j is %i \n", j);
  printf ("++j is %i \n", ++j);
  printf ("j is %i \n", j);

结果是:

//Remember that the values are i = 10, and j = 10

i is 10 
i++ is 10     //Assigns (print out), then increments
i is 11 

j is 10 
++j is 11    //Increments, then assigns (print out)
j is 11 

注意前后情况。

for循环

至于在for循环的增量块中应该使用哪一个,我认为我们做出决定的最佳方法是使用一个很好的例子:

int i, j;

for (i = 0; i <= 3; i++)
    printf (" > iteration #%i", i);

printf ("\n");

for (j = 0; j <= 3; ++j)
    printf (" > iteration #%i", j);

结果是:

> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3 

我不了解你,但我认为它的用法没有任何差别,至少在for循环中。

作者: Carlos W. Mercado 发布者: 19.02.2018 08:51

0

唯一的区别是变量的增量和运算符返回的值之间的操作顺序。

此代码及其输出解释了差异:

#include<stdio.h>

int main(int argc, char* argv[])
{
  unsigned int i=0, a;
  a = i++;
  printf("i before: %d; value returned by i++: %d, i after: %d\n", i, a, i);
  i=0;
  a = ++i;
  printf("i before: %d; value returned by ++i: %d, i after: %d\n", i, a, i);
}

输出是:

i before: 1; value returned by i++: 0, i after: 1
i before: 1; value returned by ++i: 1, i after: 1

所以基本上++i在递增后返回值,而++i在递增之前返回值。最后,在两种情况下,i将使其值增加。


标题

当返回的值没有存储在任何地方时,没有区别。一个经典的例子是for循环语法:

for(int i=0; i<10; i++)

具有相同的效果

for(int i=0; i<10; ++i)

要记住的规则

为了避免在两个运营商之间产生任何混淆,我尝试采用这个规则:

++关于变量i的顺序++与关于赋值的操作顺序相关联

换句话说:

  • ++ 之前 i意味着递增必须进行分配;
  • ++ 之后, i必须分配执行增量:
作者: Francesco Boi 发布者: 27.02.2019 05:49

-1

您可以将内部转换视为多个语句 ;

// case 1 :

i++;

/* you can think as,
 * i;
 * i= i+1;
 */

// case 2

++i;

/* you can think as,
 * i = i+i;
 * i;
 */
作者: Jeet Parikh 发布者: 06.08.2018 09:25

-3

a = i ++表示包含当前i值a = ++ i表示包含递增的i值

作者: munna 发布者: 22.01.2013 09:13

-5

以下是了解差异的示例

int i=10;
printf("%d %d",i++,++i);

输出:( 10 12/11 11取决于printf函数参数的评估顺序,因编译器和体系结构而异)

说明: i++- > i打印,然后递增。(打印10,但i将变为11) ++i- > i值增量并打印该值。(打印12,价值i也是12)

作者: srinath 发布者: 14.11.2013 01:01
32x32