разыменование и указатель продвижения в одном операторе?

StackOverflow https://stackoverflow.com/questions/1094333

Вопрос

Я читаю из массива байтов следующим образом:

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

поправьте меня, если я ошибаюсь, но ++ имеет приоритет над *, поэтому можно ли объединить *i и i++ в одном операторе?(например.*я++)

(это технически небезопасно для C#, а не для C++, p — это байт*)

Это было полезно?

Решение

я полагаю, что

id = *i;
i++;

и

id = *i++;

эквивалентны.

А ++ оператор, когда он используется в качестве суффикса (например, i++), возвращает значение переменной до приращения.


Меня несколько смущает вывод отражателя для

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

что получается как

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

и

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

которые явно не эквивалентны.

Другие советы

id = *i++

сделаю то, что ты хочешь.

++ изменяет указатель после разыменования.

РЕДАКТИРОВАТЬ:Как отмечает Эрик, согласно спецификации, ++ не происходит после разыменования.i++ увеличивает i и возвращает его начальное значение, поэтому поведение, определенное спецификацией, заключается в том, что приращение происходит до разыменования.Видимое поведение id = *i++ одинаково, независимо от того, просматриваете ли вы приращение, происходящее до или после разыменования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top