Domanda

che sto leggendo da un array di byte come segue:

int* i = (int*)p;
id = *i;
i++;

correggetemi se sbaglio, ma ++ ha la precedenza su *, così è possibile combinare il * ie i ++ nella stessa istruzione? (Ad esempio * i ++)

(questo è tecnicamente pericoloso C #, C ++ non, p è un byte *)

È stato utile?

Soluzione

Credo che

id = *i;
i++;

e

id = *i++;

sono equivalenti.

L'operatore ++, quando usato come suffisso (ad esempio i++), restituisce il valore della variabile prima dell'incremento.


Sono un po 'confuso dal uscita riflettore per

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++;
    }
}

, che esce come

public static unsafe void Test1(int p, out int id)
{
    int* i = (int*) p;
    id = i[0];
    i++;
}

e

public static unsafe void Test2(int p, out int id)
{
    int* i = (int*) p;
    i++;
    id = i[0];
}

che chiaramente non sono equivalenti.

Altri suggerimenti

id = *i++

farà quello che vuoi.

++ modifica il puntatore dopo la dereferenzia.

EDIT: Come Eric fa notare, per la specifica, ++ non accade dopo dereference. i ++ incrementi i e restituisce il suo valore iniziale, in modo che il comportamento spec definito quello incremento avvenga prima dereference. Il comportamento visibile di id = * i ++ è lo stesso se si visualizza l'incremento accade prima o dopo dereference.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top