Что делает восклицательный знак в индексе массива?
просматривая исходный репозиторий моей организации, я наткнулся на этот маленький драгоценный камень:
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, что гораздо более ясно ИМО.