eliminar la referencia y el puntero avance en una declaración?
-
11-09-2019 - |
Pregunta
Estoy leyendo de una matriz de bytes de la siguiente manera:
int* i = (int*)p;
id = *i;
i++;
corrígeme si me equivoco, pero ++ tiene prioridad sobre *, por lo que es posible combinar el * i y i ++ en el mismo estado de cuenta? (Por ejemplo, * i ++)
(esto es técnicamente inseguro C #, C ++ no, p es un byte *)
Solución
Creo que
id = *i;
i++;
y
id = *i++;
son equivalentes.
El operador ++
, cuando se utiliza como un sufijo (por ejemplo i++
), devuelve el valor de la variable antes de la incremento.
Estoy un poco confundido por la salida reflector para
unsafe class Test
{
static public void Test1(int p, out int id)
{
int* i = (int*)(p);
id = *i;
i++;
}
static public void Test2(int p, out int id)
{
int* i = (int*)(p);
id = *i++;
}
}
, que sale como
public static unsafe void Test1(int p, out int id)
{
int* i = (int*) p;
id = i[0];
i++;
}
y
public static unsafe void Test2(int p, out int id)
{
int* i = (int*) p;
i++;
id = i[0];
}
que claramente no son equivalentes.
Otros consejos
id = *i++
hará lo que usted desea.
++ modifica el puntero después de la desreferenciar.
EDIT: Como señala Eric, por la especificación, ++ no sucede después de eliminar la referencia. i ++ incrementos i y devolver su valor inicial, por lo que el comportamiento spec definido es el incremento ocurre antes de eliminar la referencia. El comportamiento visible de id = * i ++ es el mismo si desea ver el incremento ocurre antes o después de eliminar la referencia.