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 *)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top