Lenguaje C ------- la diferencia entre i++ y ++i

La diferencia entre i++ y ++i

i++Ambos y ++ison 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

++iSignifica sumar 1 al valor de i primero, y luego tomar el valor de i. Es decir, ++iel valor de es el valor después de sumar 1 a i, ++iy 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 ++ies 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 ++ide 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 ++iel 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 ++ii 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, ++ilo que no ocurre . Esta es una de las razones por las que es más eficiente ++ique . i++Sin embargo, para los compiladores de optimización modernos, generalmente realizan varias optimizaciones, de modo que la brecha de rendimiento i++entre y ++ise vuelve muy pequeña.

Supongo que te gusta

Origin blog.csdn.net/qq_43577613/article/details/130450842
Recomendado
Clasificación