La diferencia entre i++ y ++i
i++
Ambos y ++i
son operadores de incremento automático en lenguaje C, su principal diferencia radica en su orden de ejecución y valor de retorno.
i++
Significa tomar el valor de i primero y luego agregar 1 al valor de i. Es decir, i++
el valor de es el valor original de i, y i++
después , el valor de i se incrementará en 1. Por ejemplo:
int i = 5;
int a = i++; // a的值是5,i的值是6
++i
Significa sumar 1 al valor de i primero, y luego tomar el valor de i. Es decir, ++i
el valor de es el valor después de sumar 1 a i, ++i
y después de , el valor de i también aumentará en 1. Por ejemplo:
int i = 5;
int a = ++i; // a的值是6,i的值是6
Por lo tanto, la diferencia entre i++
y ++i
es su orden de ejecución y valor de retorno. Si simplemente desea aumentar i en 1, ambos métodos de escritura son posibles, pero en algunas expresiones, el valor de i++
retorno ++i
de la suma puede afectar el resultado de la expresión, y debe elegir qué método de escritura usar de acuerdo con la situación específica. .
La diferencia de ensamblaje subyacente
En la mayoría de los compiladores, esto se distingue i++
del código ensamblador generado bajo el capó.++i
Tomando como ejemplo el lenguaje ensamblador x86, supongamos que hay una variable i con un valor inicial de 0, i++
y ++i
el código ensamblador de sum es el siguiente:
; i++的汇编代码
mov eax, DWORD PTR [i]
add eax, 1
mov DWORD PTR [i], eax
; ++i的汇编代码
add DWORD PTR [i], 1
mov eax, DWORD PTR [i]
Como se puede ver en el código ensamblador anterior, i++
el valor de i se cargará primero en el registro, luego el valor de i se incrementará en 1 en el registro y, finalmente, el valor después de agregar 1 se escribirá de nuevo en i; mientras que estará directamente en ++i
i Agregar 1 a la ubicación de la memoria, y luego cargar el valor agregado en el registro.
Por lo tanto, desde el punto de vista del código ensamblador, i++
se debe realizar un acceso adicional a la memoria, ++i
lo que no ocurre . Esta es una de las razones por las que es más eficiente ++i
que . i++
Sin embargo, para los compiladores de optimización modernos, generalmente realizan varias optimizaciones, de modo que la brecha de rendimiento i++
entre y ++i
se vuelve muy pequeña.