Pergunta

Estou lendo a partir de um array de bytes da seguinte forma:

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

me corrija se eu estiver errado, mas ++ tem precedência sobre *, assim é possível combinar o * i e i ++ na mesma declaração? (Por exemplo * i ++)

(isto é tecnicamente inseguro C #, não C ++, p é um byte *)

Foi útil?

Solução

Eu acredito que

id = *i;
i++;

e

id = *i++;

são equivalentes.

O operador ++, quando utilizado como um sufixo (por exemplo i++), devolve o valor da variável antes do incremento.


Estou um pouco confuso com a saída refletor 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 sai como

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

que não são claramente equivalente.

Outras dicas

id = *i++

vai fazer o que quiser.

++ modifica o ponteiro após o dereference.

EDIT: Como Eric aponta, por especificação, ++ não acontece após dereference. incrementos i ++ i e retornar o seu valor inicial, de modo que o comportamento definido especificações é o incremento acontece antes de eliminar referência. O comportamento visível de id = * i ++ é o mesmo se você visualizar o incremento acontecer antes ou depois de excluir a referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top