for循环i++与++i的区别是前加加是先执行循环体内的内容,再加加吗?

供稿:hz-xin.com     日期:2025-01-13

区别:

一、从代码执行的效果来看,它们并无任何区别,但是它们所生成的代码是有有所不同的。

1、i++:先引用后增加;

意思是:先在i所在的表达式中使用i的当前值,后让i加1。

2、++i:先增加后引用;

意思是:让i先加1,然后在i所在的表达式中使用i的新值。

二、i++由于是在使用当前值之后再+1,所以会需要一个临时变量来转储,而++则直接+1,不存在这样的问题。

举例代码:

int c=0;

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

c=c+i;

std::cout<<c;

1、首先在debug下编译:

i++情况

; 9    :  int c;

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

mov DWORD PTR _i$20035[ebp], 0

jmp SHORT $LN3@wmain

$LN2@wmain:

mov eax, DWORD PTR _i$20035[ebp]

add eax, 1

mov DWORD PTR _i$20035[ebp], eax

$LN3@wmain:

cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H

jg SHORT $LN1@wmain

; 11   :   c=c+i;

cmp BYTE PTR $T25811[ebp], 0

jne SHORT $LN6@wmain

push OFFSET $LN7@wmain

call __RTC_UninitUse

add esp, 4

2、++i情况

; 9    :  int c;

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

mov DWORD PTR _i$20035[ebp], 0

jmp SHORT $LN3@wmain

$LN2@wmain:

mov eax, DWORD PTR _i$20035[ebp]

add eax, 1

mov DWORD PTR _i$20035[ebp], eax

$LN3@wmain:

cmp DWORD PTR _i$20035[ebp], 50  ; 00000032H

jg SHORT $LN1@wmain

; 11   :   c=c+i;

mp BYTE PTR $T25811[ebp], 0

jne SHORT $LN6@wmain

push OFFSET $LN7@wmain

call __RTC_UninitUse

add esp, 4

$LN6@wmain:

mov eax, DWORD PTR _c$[ebp]

add eax, DWORD PTR _i$20035[ebp]

mov BYTE PTR $T25811[ebp], 1

mov DWORD PTR _c$[ebp], eax

jmp SHORT $LN2@wmain

$LN1@wmain:

三、

++i确实省去了对内存操作的环节,直接add eax, 1,用++i真的能提高性能。

当然,上面是用debug版本,也就是说没有优化,那么在release优化的情况下。

举例:

1、i++优化

; 9    :  int c;

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

mov ecx, DWORD PTR _c$[esp+4]

xor eax, eax

$LL3@wmain:

; 11   :   c=c+i;

add ecx, eax

inc eax

cmp eax, 50     ; 00000032H

jle SHORT $LL3@wmain

2、++i优化

; 9    :  int c;

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

mov ecx, DWORD PTR _c$[esp+4]

xor eax, eax

$LL3@wmain:

; 11   :   c=c+i;

add ecx, eax

inc eax

cmp eax, 50     ; 00000032H

jle SHORT $LL3@wmain

结论:在没有编译器优化的情况下,++i更好。优化过后两者都一样,看起来似乎喜欢怎样写都无所谓了。

但是如果这里的i不是int而是迭代器,那么++在前和在后就会有所不同,使用++i将会有切实的更高的效率。虽然int情况下没多少区别,但为了语法上的统一,最好一律改用++i这种形式。

参考资料:

百度百科——for循环



i++和++i命令有什么区别?
i++和++i都是用于增加变量i的值的操作,但它们在使用和结果上存在明显的区别。详细解释:1. i++ 的解释:i++是一个后缀自增运算符。它的操作过程是,先返回变量i的当前值,然后将i的值增加1。这意味着在执行i++后,i的值会增加,但返回的是增加之前的值。这种后置的自增操作常常用在需要...

i++和++ i有什么不同吗?
输出结果:for(++i)循环:输出结果:3、print()输出函数内,不仅形式不同且输出结果也不同:i++和++i,二者在形式上明显不同,且输出结果也不同,输出值分别为1和2。如下图所示:for(i++)循环:输出结果:for(++i)循环:输出结果:参考资料:百度百科-for循环中关于i++与++i的阐释 ...

i++和++i命令有什么区别?
在循环或一般情况下,两者在效率上可能没有明显差异,但需要注意的是,它们可能会影响到变量i的生存周期和可能存在的写脏问题。因此,根据程序的特定需求,选择合适的运算符至关重要。总结来说,i++和++i的主要区别在于执行顺序、返回值以及作为左值的可用性,这在编程实践中需要根据上下文灵活运用。

c语言i++和++ i的区别是什么啊?
c语言 i++和++i的区别:1、i++式子值为i原来的值,就是通俗说的“先赋值再加1”;2、而++i式子值为i变化后的值,也就是“先加1后赋值”。而在for循环中,如果要表示递增,两种都可以。

i++和++i的区别
这在单一的操作中可能不会造成明显影响,但在复杂的表达式或循环中可能会导致显著的区别。例如,在for循环的条件判断中,这种区别可能会导致循环次数或行为的不同。总的来说,i++和++i虽然都表示自增操作,但在操作顺序和返回值的时机上存在差异。理解这些差异对于编写高效且准确的代码至关重要,特别是...

for循环i++与++i的区别是前加加是先执行循环体内的内容,再加加吗?
两个对于循环的次数都是没影响的,都是5次,都是当 i 小于5 不成立的时候跳出循环,但后面的 i 还是会递增1的。两者不同的地方在于++i 占用的空间比 i++ 要小,i++是多定义一个变量的。看看运算符重载可以知道是怎么回事。

i++和++i的区别
您好!很高兴为您解答。i++:先引用i的值,再将i自加1;++i:先将i自加1,再引用i的值。程序中return 0;表示主函数返回值为0,即程序结束,所以for循环在执行第一遍的时候已经结束了。望采纳~若您还有不解,欢迎追问~

i++与i+ i的区别是什么?
++i是还没用i之前就进行i=i+1的运算.类比可以得到i--,--i的意义 分析上题(1)第一问:i=1,j=10; 比较完后j减去1,但要注意的是++i跟6进行比较时,已经进行加一的运算,所以是2与6比较.以此类推,可得j=5,即j减5此,那么i要加5次,所以i=6,j=5 (2):第二问进行一次循环后j减去1,但...

++i和I++的区别
先加和后加的区别int i=0;int j=i++;\/\/后加,即i的值赋给j之后,i才加1,最后结果是j=0,i=1;i=0;\/\/i重新归0;int j=++i;\/\/前加,即i的值赋给j之前i已经加了1,最后结果是j=1,i=1;

C语言关于i++的问题,是在下次循环i加1,还是说遇到i时加1?
首先第一点, i++ 和 ++i 用法是不一样的;对于 i++ 先使用i的值,然后i再加一,而对于++i 是先让i的值加一再用i的值。i-- 和 --i 也是同样的道理,C语言书上有明确的讲解,主要看一下书上给的例子。其次,对于 for(j=0;j<4;j++){ printf("%2d ",*(*(p+i)+j)); ...