разыменование и указатель продвижения в одном операторе?
-
11-09-2019 - |
Вопрос
Я читаю из массива байтов следующим образом:
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++ одинаково, независимо от того, просматриваете ли вы приращение, происходящее до или после разыменования.