Что делает восклицательный знак в индексе массива?
просматривая исходный репозиторий моей организации, я наткнулся на этот маленький драгоценный камень:
RawParameterStorage[!ParameterWorkingIdx][ParameterDataOffset] = ...
это правильный код? Что делает восклицательный знак здесь?
инвертировать ~
оператор может иметь смысл, так как его обычно путают с not !
оператор в логических выражениях. Однако, кажется, не имеет логического смысла навязывать not !
оператор индекса массива. Есть Мысли?
4 ответов
!ParameterWorkingIdx
означает ParameterWorkingIdx
is 0
, Если это, !ParameterWorkingIdx
оценивается как true
что может быть неявно преобразован в тип индексатора (например, 1
для целочисленного индексатора, как в массиве), в противном случае он вычисляется как false
.
если
ParameterWorkingIdx == 0
затем[!ParameterWorkingIdx] == [1]
.если
ParameterWorkingIdx != 0
затем[!ParameterWorkingIdx] == [0]
.
он также зависит от других вещей, таких как:
тип
ParameterWorkingIdx
.перегрузка
! operator
по типуParameterWorkingIdx
.перегрузка индексатора по типу
RawParameterStorage
.etc...
немного угадываю здесь, но это похоже на шаблон с двойным буфером. ParameterWorkingIdx
будет флип-флоп между 0
и 1
(вероятно, с ParameterWorkingIdx = !ParameterWorkingIdx;
).
тогда, в любое время,RawParameterStorage[ParameterWorkingIdx]
будет текущим буфером, и RawParameterStorage[!ParameterWorkingIdx]
будет предыдущим буфером.
кажется, нет логического смысла навязывать not
!
оператор на индексе массива
это может: все, что он делает здесь, это преобразовать ноль в один, а любое другое число в ноль.
из этого кода можно сделать вывод, что RawParameterStorage
вероятно, имеет два элемента на верхнем уровне.
P. S. Здесь, я предполагаю, что RawParameterStorage
является массивом (как вы говорите). Более того, я предполагаю, что ParameterWorkingIdx
- целое число (как следует из его названия). Если, например, либо это класс с перегруженными операторами, чем семантика может быть абсолютно разным.
это правильный код?
Да, это так. Предположим ParameterWorkingIdx
быть int
, for !ParameterWorkingIdx
при использовании operators !
, будет контекстно конвертируемый в bool,
нулевое значение (для перечисления integral, floating-point и unscoped) и нулевой указатель и значения нулевого указателя на член становятся
false
. Все остальные значения становятсяtrue
.
затем Интеграл повышен для использования в качестве индекса массива.
тип bool может быть преобразован в int со значением
false
становится 0 иtrue
становится 1.
так !ParameterWorkingIdx
эквивалентно ParameterWorkingIdx == 0 ? 1 : 0
, что гораздо более ясно ИМО.