Question

Je lis à partir d'un tableau d'octets comme suit:

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

me corriger si je me trompe, mais ++ a priorité sur *, donc il est possible de combiner le * i et i ++ dans la même déclaration? (Par exemple, * i ++)

(ce qui est techniquement dangereux C #, C ++ non, p est un octet *)

Était-ce utile?

La solution

Je crois que

id = *i;
i++;

et

id = *i++;

sont équivalentes.

L'opérateur ++, lorsqu'il est utilisé en tant que suffixe (par exemple i++), renvoie la valeur de la variable avant l'incrément.


Je suis un peu confus par la sortie du réflecteur pour

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

qui vient comme

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

et

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

qui ne sont manifestement pas équivalentes.

Autres conseils

id = *i++

va faire ce que vous voulez.

++ modifie le pointeur après la déréférencer.

EDIT: Comme Eric souligne, par la spécification, ++ ne se produit pas après déréférencement. i ++ incrémente i et retourne sa valeur initiale, de sorte que le comportement défini de spécification est l'incrément se produit avant le déréférencement. Le comportement visible id = * i ++ est le même que vous affichez l'incrément qui se passe avant ou après déréférencement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top